能否用Glade创建GtkPopoverMenu?如何添加菜单项?
GtkPopoverMenu是基于GMenuModel设计的菜单控件,直接添加GtkButton这类普通控件不符合它的使用规范。你既可以在Glade中可视化配置菜单项,也能通过代码实现,两种方式都可行:
一、Glade可视化配置步骤
- 在Glade控件面板中添加
GtkPopoverMenu控件。 - 在Glade的「Objects」面板右键选择Add Object,搜索并创建
GioMenu(这就是菜单模型)。 - 选中创建好的
GioMenu,在右侧属性面板的「Items」中添加菜单项:- 设置
Label为菜单项显示文本 - 设置
Action为菜单项触发的动作名(后续需在代码中注册对应动作) - 需要子菜单的话,再创建一个
GioMenu,在父菜单项的Submenu中选择这个子菜单即可。
- 设置
- 回到
GtkPopoverMenu的属性面板,找到menu-model属性,选择你创建的GioMenu完成绑定。
修正后的Glade代码示例
<?xml version="1.0" encoding="UTF-8"?> <interface> <object class="GtkPopoverMenu" id="popover_menu"> <property name="menu-model">main_menu</property> </object> <object class="GioMenu" id="main_menu"> <items> <item label="新建文件" action="app.new_file"/> <item label="打开文件" action="app.open_file"/> <section> <item label="设置" submenu="settings_submenu"/> </section> </items> </object> <object class="GioMenu" id="settings_submenu"> <items> <item label="外观设置" action="app.appearance_settings"/> <item label="快捷键设置" action="app.shortcut_settings"/> </items> </object> </interface>
二、编程实现方式(更灵活)
如果需要动态生成菜单项或实现复杂逻辑,可通过代码创建GMenuModel并绑定到GtkPopoverMenu:
Python示例代码
from gi.repository import Gtk, Gio # 加载Glade UI文件 builder = Gtk.Builder() builder.add_from_file("your_ui.glade") # 创建主菜单模型 main_menu = Gio.Menu.new() main_menu.append("新建文件", "app.new_file") main_menu.append("打开文件", "app.open_file") # 创建子菜单 settings_submenu = Gio.Menu.new() settings_submenu.append("外观设置", "app.appearance_settings") main_menu.append_submenu("设置", settings_submenu) # 将菜单模型绑定到PopoverMenu popover_menu = builder.get_object("popover_menu") popover_menu.set_menu_model(main_menu) # 注册菜单项动作(示例) def on_new_file(action, param): print("新建文件被触发") app = Gtk.Application.new("com.example.MyApp", Gio.ApplicationFlags.FLAGS_NONE) app.add_action(Gio.SimpleAction.new("new_file", None)) app.connect("activate", on_new_file)
关键注意点
- 不要直接给
GtkPopoverMenu添加GtkButton等普通控件,这会破坏它的菜单布局逻辑,正确方式是通过GMenuModel定义菜单项。 - 菜单项的动作必须在代码中注册对应的
GAction,否则点击后不会有响应。
内容的提问来源于stack exchange,提问作者Damn Vegetables
相关产品推荐
相关产品推荐

