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

能否用Glade创建GtkPopoverMenu?如何添加菜单项?

在Glade中给GtkPopoverMenu添加菜单项的方法

GtkPopoverMenu是基于GMenuModel设计的菜单控件,直接添加GtkButton这类普通控件不符合它的使用规范。你既可以在Glade中可视化配置菜单项,也能通过代码实现,两种方式都可行:

一、Glade可视化配置步骤

  1. 在Glade控件面板中添加GtkPopoverMenu控件。
  2. 在Glade的「Objects」面板右键选择Add Object,搜索并创建GioMenu(这就是菜单模型)。
  3. 选中创建好的GioMenu,在右侧属性面板的「Items」中添加菜单项:
    • 设置Label为菜单项显示文本
    • 设置Action为菜单项触发的动作名(后续需在代码中注册对应动作)
    • 需要子菜单的话,再创建一个GioMenu,在父菜单项的Submenu中选择这个子菜单即可。
  4. 回到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 22:05:17