如何在GJS中为GtkPopoverMenu定义子菜单?
首先纠正一个误解:#GtkPopoverMenu:submenu 并不是 GtkPopoverMenu 自身的属性,而是它的子部件的“子属性”——也就是说,你需要给 GtkPopoverMenu 内部的菜单项(比如 GtkModelButton)设置这个子属性,来关联对应的子菜单容器。
另外,GtkPopoverMenu 确实只接受单个直接子部件,但这个子部件可以是一个 GtkBox(垂直布局),在这个 Box 里你可以放多个菜单项和子菜单容器,从而实现多级菜单结构。
下面是纯代码实现的示例(GJS + GTK3):
const Gtk = imports.gi.Gtk; Gtk.init(null); // 创建主窗口 const window = new Gtk.Window({ title: "PopoverMenu 示例" }); window.connect("destroy", () => Gtk.main_quit()); window.set_default_size(300, 200); // 创建触发按钮 const button = new Gtk.Button({ label: "打开菜单" }); window.add(button); // 1. 创建主 PopoverMenu const popoverMenu = new Gtk.PopoverMenu({ relative_to: button }); // 2. 创建主菜单容器(垂直Box) const mainBox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL, spacing: 6 }); popoverMenu.add(mainBox); // 3. 创建普通菜单按钮 const item1 = new Gtk.ModelButton({ label: "普通选项1" }); mainBox.add(item1); const item2 = new Gtk.ModelButton({ label: "普通选项2" }); mainBox.add(item2); // 4. 创建带箭头的子菜单触发按钮,并设置 submenu 子属性 const submenuTrigger = new Gtk.ModelButton({ label: "展开子菜单", use_underline: false }); // 关键:给按钮设置 GtkPopoverMenu:submenu 子属性,值为子菜单容器的名字 submenuTrigger.set_child_property(popoverMenu, "submenu", "submenu-1"); mainBox.add(submenuTrigger); // 5. 创建子菜单容器(GtkBox),并设置名字为上面指定的 "submenu-1" const submenuBox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL, spacing: 6, name: "submenu-1" }); mainBox.add(submenuBox); // 6. 给子菜单添加选项 const subItem1 = new Gtk.ModelButton({ label: "子选项1" }); submenuBox.add(subItem1); const subItem2 = new Gtk.ModelButton({ label: "子选项2" }); submenuBox.add(subItem2); // 显示所有部件 mainBox.show_all(); window.show_all(); Gtk.main();
关键说明:
- 用
set_child_property()方法给子部件(这里是ModelButton)设置GtkPopoverMenu:submenu子属性,关联到对应名字的子菜单容器。 - 子菜单容器必须设置唯一的
name属性,和触发按钮的submenu值对应。 - 所有菜单内容都放在同一个主
GtkBox里,GtkPopoverMenu会自动识别带submenu属性的按钮,并切换显示对应的子菜单容器。
内容的提问来源于stack exchange,提问作者cidra
相关产品推荐
相关产品推荐

