You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 15:51:04