使用GTK4在C语言中实现菜单栏File->Connect菜单项的方法
GTK4 实现 File->Connect 菜单结构的解决方案
你原有代码的核心问题是动作ID大小写不匹配,导致菜单项无法和触发动作绑定,修正后的可运行代码如下:
#include <gtk/gtk.h> // 菜单项点击回调,参数符合GAction的activate信号规范 static void connect_activated(GSimpleAction *action, GVariant *param, gpointer user_data) { puts("Connect menu item clicked.\n"); } static void activate(GApplication *app, gpointer *data) { GtkWidget *win = gtk_application_window_new(GTK_APPLICATION(app)); gtk_window_set_title(GTK_WINDOW(win), "IRC Client"); gtk_window_set_default_size(GTK_WINDOW(win), 800, 800); // 这里动作ID用小写connect,和后面菜单项绑定的app.connect完全匹配 GSimpleAction *act_connect = g_simple_action_new("connect", NULL); g_action_map_add_action(G_ACTION_MAP(app), G_ACTION(act_connect)); g_signal_connect(act_connect, "activate", G_CALLBACK(connect_activated), NULL); // 构建菜单结构 GMenu *menubar = g_menu_new(); // 顶层File菜单项 GMenuItem *menu_file = g_menu_item_new("File", NULL); // File的子菜单 GMenu *file_submenu = g_menu_new(); // Connect子菜单项,绑定应用级动作app.connect GMenuItem *item_connect = g_menu_item_new("Connect", "app.connect"); g_menu_append_item(file_submenu, item_connect); g_object_unref(item_connect); // 把子菜单绑定到File顶层菜单项 g_menu_item_set_submenu(menu_file, G_MENU_MODEL(file_submenu)); // 把File菜单项添加到菜单栏 g_menu_append_item(menubar, menu_file); g_object_unref(menu_file); // 给应用设置菜单栏,开启窗口的菜单栏显示开关 gtk_application_set_menubar(GTK_APPLICATION(app), G_MENU_MODEL(menubar)); gtk_application_window_set_show_menubar(GTK_APPLICATION_WINDOW(win), TRUE); gtk_window_present(GTK_WINDOW(win)); } int main(int argc, char **argv) { GtkApplication *app; int stat; app = gtk_application_new("com.ircclient", G_APPLICATION_FLAGS_NONE); g_signal_connect(app, "activate", G_CALLBACK(activate), NULL); stat = g_application_run(G_APPLICATION(app), argc, argv); g_object_unref(app); return stat; }
关键说明
- GTK的动作ID是大小写敏感的,原有代码中动作命名为大写开头的
Connect,但菜单项绑定的是小写的app.connect,二者不匹配会导致菜单项置灰无法点击 - 回调函数名修改为
connect_activated,避免和POSIX标准的connect网络函数重名导致编译错误 - 编译命令参考:
gcc 源文件名.c -o 输出文件名pkg-config --cflags --libs gtk4``
内容的提问来源于stack exchange,提问作者ktm5124
相关产品推荐
相关产品推荐

