GTK4 C语言开发中动作如何绑定菜单项、菜单项无法点击怎么解决?
问题修复方案
你代码中存在多处语法和API调用错误,逐一修正后即可解决菜单项未激活的问题:
错误点列表
- 信号名拼写错误:GtkApplication的启动信号是
activate,你误写为active,导致窗口初始化逻辑根本没有被触发 - 宏拼写错误:回调绑定宏是
G_CALLBACK,你多写了一个下划线写成G_CALL_BACK,信号连接直接失败 - 缺少前置声明:
create_window、quit两个函数在调用前没有声明,编译时会触发隐式声明警告,运行逻辑异常 - 变量未声明:
application、window两个变量使用前没有定义类型 - 字符串语法错误:
quit函数内g_print的字符串和换行符拆分到两行,属于语法错误
修正后的完整代码
#include <gtk/gtk.h> // 前置声明 static void quit(GSimpleAction *action, GVariant *parameter, gpointer data); void create_window(GtkApplication *application); int main(int argc, char **argv) { int status; // 声明application变量 GtkApplication *application = gtk_application_new("gtk.example", G_APPLICATION_DEFAULT_FLAGS); // 修正信号名和G_CALLBACK宏 g_signal_connect_swapped(application, "activate", G_CALLBACK(create_window), application); status = g_application_run(G_APPLICATION(application), argc, argv); g_object_unref(application); return status; } void create_window(GtkApplication *application) { GMenu *menubar; GMenu *menu; GMenuItem *item; // 声明window变量 GtkWindow *window = gtk_application_window_new(application); gtk_window_set_application(GTK_WINDOW(window), application); const GActionEntry entries[] = { {"close", quit} }; g_action_map_add_action_entries(G_ACTION_MAP(application), entries, G_N_ELEMENTS(entries), NULL); menubar = g_menu_new(); menu = g_menu_new(); item = g_menu_item_new("Close", "app.close"); g_menu_append_item(menu, item); g_object_unref(item); g_menu_append_submenu(menubar, "File", G_MENU_MODEL(menu)); g_object_unref(menu); gtk_application_set_menubar(application, G_MENU_MODEL(menubar)); gtk_application_window_set_show_menubar(GTK_APPLICATION_WINDOW(window), TRUE); gtk_window_present(GTK_WINDOW(window)); } static void quit(GSimpleAction *action, GVariant *parameter, gpointer data) { // 修正字符串换行错误 g_print("You choose close action\n"); // 如果需要点击后关闭窗口可以加下面这行 // gtk_window_close(GTK_WINDOW(data)); }
编译运行说明
使用以下命令编译(需要先安装GTK4开发包):
gcc -o gtk_menu_test gtk_menu_test.c `pkg-config --cflags --libs gtk4`
运行后File菜单下的Close项即可正常点击,点击后会在终端打印对应日志。
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

