我的应用程序在顶部栏中有一个“编辑”菜单。打开菜单时,我想更改其内容的敏感度(启用/禁用)和可见性。
我正在使用GMenu / GMenuItem创建菜单。打开子菜单时,我感觉如何?
备注:{
GMenu * menubar = g_menu_new();
GMenu * edit = g_menu_new();
g_menu_append_submenu(menubar,"_Edit", G_MENU_MODEL(edit));
g_menu_append(edit, "_Copy" , "edit.copy" );
g_menu_append(edit, "_Paste", "edit.paste" );
gtk_application_set_menubar(app, G_MENU_MODEL(menubar));
}
您需要使用属性submenu-action。这不会给您“打开”回调,而是“打开”或“关闭”回调。但这可能是您可以获得的最接近的产品。
Here是如何在ui文件中使用它的示例:
<submenu id="time-menu">
<attribute name="label" translatable="yes">Time</attribute>
<attribute name="submenu-action">app.time-active</attribute>
</submenu>
从API使用它有点棘手:您需要创建一个GMenuItem,它将您的GMenu * edit
保留为子菜单。
GMenu (menubar)
|
|-- GMenuItem ("Edit" (edit_item)) <-- new part
|
|-- GMenu (edit_content)
|
|-- GMenuItem ("Copy")
|
|-- GMenuItem ("Paste")
{
GMenu * menubar = g_menu_new ();
// Container for all menu items of the "Edit" menu
GMenu * edit_content = g_menu_new ();
{
g_menu_append (edit_content, "_Copy" , "edit.copy" );
g_menu_append (edit_content, "_Paste", "edit.paste");
}
// create the "Edit" menu button, that has an "on-click" event
GMenuItem * edit_menu;
{
edit_menu = g_menu_item_new ("Edit", "randomAction"); // (the action will be discarded later)
// set action, that's fired up on click
g_menu_item_set_attribute (edit_menu,"submenu-action", "&s",
"app.menu_edit_clicked", NULL);
// insert the content of menu
g_menu_item_set_submenu (edit_menu, G_MENU_MODEL (edit_content));
// add it to window
g_menu_append_item (menubar, edit_menu);
// set the on-click action(s) for the submenu
GActionEntry actions[] = {
{.name="menu_edit_clicked", .state="false",
.change_state=dt_window_menu_on_click}
};
g_action_map_add_action_entries (G_ACTION_MAP (app), actions, G_N_ELEMENTS (actions), NULL);
}
gtk_application_set_menubar (app, G_MENU_MODEL (menubar));
g_object_unref (menubar);
}
您通常不会在菜单打开时更改GMenu项的可见性/敏感性;您总是根据内部状态更改GAction状态,这将更新GMenu的可见性/敏感性,这将更新小部件的状态。
动作是模型;菜单是控制器;以及GTK隐式创建的小部件是视图。