Gtk3:GMenu / GMenuItem:如何检测子菜单是否打开? (子菜单的信号)

问题描述 投票:0回答:2

我的应用程序在顶部栏中有一个“编辑”菜单。打开菜单时,我想更改其内容的敏感度(启用/禁用)和可见性。

我正在使用GMenu / GMenuItem创建菜单。打开子菜单时,我感觉如何?

备注:
  • 我不想使用GtkMenu(由于弃用)
  • 我检查了GMenu的信号,但没有信号。

我如何创建菜单:

{
  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));
}
c menu gtk gtk3 submenu
2个回答
0
投票

您需要使用属性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使用它

从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);
}

0
投票

您通常不会在菜单打开时更改GMenu项的可见性/敏感性;您总是根据内部状态更改GAction状态,这将更新GMenu的可见性/敏感性,这将更新小部件的状态。

动作是模型;菜单是控制器;以及GTK隐式创建的小部件是视图。

© www.soinside.com 2019 - 2024. All rights reserved.