You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GJS中为GtkPopoverMenu定义子菜单?

GTK3 中通过代码实现 GtkPopoverMenu 子菜单(无需 MenuModel)

首先纠正一个误解:#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 06:43:11