Contents Menu Expand Light mode Dark mode Auto light/dark, in light mode Auto light/dark, in dark mode
GNOME 开发者文档
GNOME 开发者文档

目录

  • 平台介绍
    • 平台组件
      • 库
      • 服务
    • 编程语言
    • GNOME Builder
    • Flatpak
    • GNOME 组件
  • 指南
    • 编程指南
      • C 编码风格
      • 内存管理
      • 编写良好代码的重要性
      • 优化 GNOME 应用程序
      • 命名空间
      • 内省
    • 可访问性
      • 编写支持可访问性的代码指南
      • 使自定义组件可访问
    • 本地化
      • 本地化的最佳实践
    • 维护者指南
      • API 稳定性
      • 并行可安装性
      • 与 GNOME 集成
    • 开发者文档风格指南
    • 人类界面指南
  • 工具
    • GTK Inspector
    • Valgrind
    • Massif
    • Sysprof
  • 教程
    • 初学者教程
      • 入门
        • 添加内容视图
        • 从文件加载内容
        • 显示光标位置
        • 将内容保存到文件
        • 保存应用程序状态
        • 使用 Toast 通知用户
        • 强制使用深色配色方案
      • UI 组件
        • 窗口
        • 图像
        • 标签
        • 按钮
        • 盒子
        • 堆栈
        • 小册子
        • 切换开关
        • 复选框
        • 单选按钮
        • 微调按钮
        • 链接按钮
        • 开关
        • 菜单按钮
        • 输入框
        • 密码输入框
        • 消息
        • 文件对话框
        • 进度条
        • 等级条
    • 应用程序 ID
    • 使用 GtkApplication
    • 保存和加载窗口状态
    • 使用通知
    • 主题图标
    • 处理弃用
    • 动作
    • 菜单
    • 编写搜索提供程序
    • 前置条件和后置条件
    • 主上下文
    • 使用 GLib 列表
    • 线程
    • 异步编程
    • 拖放
    • Widget 模板
  • 规范
    • GVariant 规范 1.0
返回顶部
编辑此页

菜单¶

为了在 GTK 中创建菜单,您需要使用 GMenu API 描述菜单结构;每个菜单项都绑定到一个 GAction。

可以使用 GMenu API 直接手动构建菜单模型。这有点麻烦

GMenu *menu = g_menu_new ();

// The "Evocations" section
GMenu *section = g_menu_new ();

// g_menu_append() creates a menu item for you
g_menu_append (section, "Magic Missile", "app.magicmissile");

g_menu_append_section (menu, "Evocations", section);
g_object_unref (section);

// The "Cantrips" section
section = g_menu_new ();

// An explicit menu item
GMenuItem *item = g_menu_item_new ("Fire Bolt", "app.firebolt");

// "cantrips_icon" is a GIcon and is defined elsewhere
g_menu_item_set_icon (item, cantrips_icon);
g_menu_append_item (section, item);

g_menu_append_section (menu, "Cantrips", section);
g_object_unref (section);
menu = Gio.Menu()

# The "Evocations" section
section = Gio.Menu()

# Gio.Menu.append() creates a menu item for you
section.append("Magic Missile", "app.magicmissile")

menu.append_section("Evocations", section)

# The "Cantrips" section
section = Gio.Menu()

# An explicit menu item
item = Gio.MenuItem()
item.set_label("Fire Bolt")
item.set_detailed_action("app.firebolt")

# "cantrips_icon" is a Gio.Icon and is defined elsewhere
item.set_icon(cantrips_icon)
section.append_item(item)

menu.append_section("Cantrips", section)
const menu = new Gio.Menu();

// The "Evocations" section
let section = new Gio.Menu();

// Gio.Menu.append() creates a menu item for you
section.append("Magic Missile", "app.magicmissile");

menu.append_section("Evocations", section);

// The "Cantrips" section
section = new Gio.Menu();

// An explicit menu item
const item = new Gio.MenuItem();
item.set_label("Fire Bolt");
item.set_detailed_action("app.firebolt");

// "cantrips_icon" is a Gio.Icon and is defined elsewhere
item.set_icon(cantrips_icon);
section.append_item(item);

menu.append_section("Cantrips", section);
var menu = new Menu ();

// The "Evocations" section
var section = new Menu ();

section.append ("Magic Missile", "app.magicmissile");

menu.append_section ("Evocations", section);

// The "Cantrips" section
section = new Menu ();

// an explicit menu item
var item = new MenuItem () {
  label = "Fire Bolt",
  detailed_action = "app.firebolt"
};

// "cantrips_icon" is a GLib.Icon and is defined elsewhere
item.set_icon (cantrips_icon)

menu.append_section ("Cantrips", section);

或者,您可以使用 UI 定义

<interface>
  <menu id="menu">
    <section>
      <item>
        <attribute name="label" translatable="yes">Magic Missile</attribute>
        <attribute name="action">app.magicmissile</attribute>
      </item>
    </section>
    <section>
      <attribute name="label" translatable="yes">Cantrips</attribute>
      <item>
        <attribute name="label" translatable="yes">Fire Bolt</attribute>
        <attribute name="action">app.firebolt</attribute>
        <attribute name="icon">/usr/share/my-app/cantrips.png</attribute>
      </item>
    </section>
  </menu>
</interface>

使用 GtkBuilder 加载它,并将其检索为 GMenuModel

GtkBuilder *builder =
  gtk_builder_new_from_resource ("/my/favourite/spells/menu.ui");

GMenuModel *menu =
  G_MENU_MODEL (gtk_builder_get_object ("menu");
builder = Gtk.Builder.new_from_resource("/my/favourite/spells/menu.ui")
menu = builder.get_object("menu")
const builder = Gtk.Builder.new_from_resource("/my/favourite/spells/menu.ui");
const menu = builder.get_object("menu");
var builder = new Gtk.Builder.from_resource ("/my/favourite/spells/menu.ui");
Menu menu = builder.get_object ("menu");

主菜单¶

在现代用户界面中,一种常见的模式是在某个显眼的位置(通常是右上角)放置一个按钮,通常带有齿轮图标,单击时会打开菜单。GTK 针对此用例提供了 GtkMenuButton

GtkBuilder *builder =
  gtk_builder_new_from_resource ("/my/favourite/spells/menu.ui");
GMenu *menu =
  G_MENU_MODEL (gtk_builder_get_object (builder, "menu"));

// "menu_button" is defined elsewhere
gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (menu_button), menu);
gtk_menu_button_set_primary (GTK_MENU_BUTTON (menu_button), TRUE);

g_object_unref (builder);
builder = Gtk.Builder.new_from_resource("/my/favourite/spells/menu.ui")
menu = builder.get_object("menu")

# "menu_button" is defined elsewhere
menu_button.set_menu_model(menu)
menu_button.set_primary(True)
const builder = Gtk.Builder.new_from_resource("/my/favourite/spells/menu.ui");
const menu = builder.get_object("menu");

// "menu_button" is defined elsewhere
menu_button.set_menu_model(menu);
menu_button.set_primary(true);
var builder = new Gtk.Builder.from_resource ("/my/favourite/spells/menu.ui");
Menu menu = builder.get_object ("menu");

// "menu_button" is defined elsewhere
menu_button.menu_model = menu;
menu_button.primary = true;

菜单栏¶

虽然在 GNOME 应用程序中不常见,但仍然可以使用 GtkPopoverMenuBar 创建菜单栏。

上下文菜单¶

可以使用 gtk_popover_menu_new_from_model() 从菜单模型创建“独立”菜单。然后,可以将此菜单用作任何小部件的上下文菜单。此类菜单中引用的操作可以来自应用程序或窗口范围。您还可以使用 gtk_widget_insert_action_group() 引入更本地化的范围。来自此类本地范围的操作可以在附加到此本地范围之下的任何菜单中使用。

图标¶

为了向菜单项添加图标,必须在菜单模型中的项目上指定 icon 属性;在构建菜单时,图标将正确放置在 UI 中。此属性的预期值是序列化的 GIcon。幸运的是,GIcon 序列化格式对此非常方便——例如

<attribute name="icon">/path/to/my/icon.png</attribute>

是针对给定路径的文件 GFileIcon 的有效序列化,而

<attribute name="icon">preferences-desktop-locale-symbolic</attribute>

是针对 preferences-desktop-locale-symbolic 符号图标的 GThemedIcon 的有效序列化。

下一页
编写搜索提供程序
上一页
动作
在此页上
  • 菜单
    • 主菜单
    • 菜单栏
    • 上下文菜单
    • 图标