为 AppIndicator 中的子菜单设置操作

hyt*_*omo 7 indicator c application-development

我正在尝试用 C 构建一个简单的指标。这是我的代码:

void make_indicator(){
    //Making the indicator
    appindicator = app_indicator_new("My Indicator", "/home/alex/Qt/normal_tray_icon/a.png", APP_INDICATOR_CATEGORY_APPLICATION_STATUS);

    //the construction of the main menu
    GtkWidget* indicatormenu = gtk_menu_new();
    //adding a submenu
    GtkWidget* submenu1 = gtk_menu_item_new_with_label("SubMenu1");
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(submenu1), indicatormenu);

    /* HERE */
    //here comes the error! Adding an option to the submenu    
    GtkWidget* submenu1_option;
    submenu1_option = gtk_menu_item_new_with_label("Submenu option!");
    gtk_menu_shell_append(GTK_MENU_SHELL(submenu1), submenu1_option);

    //adding an option to the main menu and connecting it to a slot
    GtkWidget* showapp_option;

    showapp_option = gtk_menu_item_new_with_label("Show App!");
    g_signal_connect(showapp_option, "activate", G_CALLBACK(show_app), this);
    gtk_menu_shell_append(GTK_MENU_SHELL(indicatormenu), showapp_option);

    //showing the indicator
    gtk_widget_show_all(indicatormenu);
    app_indicator_set_status(appindicator, APP_INDICATOR_STATUS_ACTIVE);
    app_indicator_set_attention_icon(appindicator, "dialog-warning");

    app_indicator_set_menu(appindicator, GTK_MENU (indicatormenu));
}
Run Code Online (Sandbox Code Playgroud)

我无法向子菜单添加操作。我将子菜单添加为一个简单的菜单项,因此我无法向其附加操作,或者可以吗?

我在编译时没有收到错误消息,但在运行时我得到:

(normal_tray_icon:9203): GLib-GObject-WARNING **: invalid cast from `GtkMenuItem' to `GtkMenuShell'

(normal_tray_icon:9203): Gtk-CRITICAL **: IA__gtk_menu_shell_insert: assertion `GTK_IS_MENU_SHELL (menu_shell)' failed
Run Code Online (Sandbox Code Playgroud)

我可以理解,但我不知道如何解决。

感谢您提供任何答案。

Dam*_*ian 3

您仅为子菜单创建了项目,而不是子菜单。这可以通过以下方式完成:

//添加子菜单:
//创建子菜单
GtkWidget *submenu1 = gtk_menu_new();
GtkWidget *submenu1_item = gtk_menu_item_new_with_label("SubMenu1");
gtk_menu_item_set_submenu(GTK_MENU_ITEM(submenu1_item), submenu1);

//在主菜单中添加子菜单
gtk_menu_shell_append(GTK_MENU_SHELL(indicatormenu), submenu1_item);

//向子菜单添加一个选项    
GtkWidget* submenu1_option;
submenu1_option = gtk_menu_item_new_with_label("子菜单选项!");
gtk_menu_shell_append(GTK_MENU_SHELL(submenu1), submenu1_option);