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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:57:01