菜单¶
为了在 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 的有效序列化。