【问题标题】:Creating a simple menubar, menu and menu item in C using GTK4使用 GTK4 在 C 中创建一个简单的菜单栏、菜单和菜单项
【发布时间】:2021-11-07 04:01:11
【问题描述】:

我使用 GTK4 创建了一个简单的 C 应用程序,它有一个窗口、一个菜单栏、一个菜单和一个菜单项。我希望菜单读取“文件”,文件下方的菜单项读取“连接”。如何对菜单和菜单栏进行编码,以便我有一个菜单 File->Connect?

#include <gtk/gtk.h>

static void connect(GApplication *app, gpointer *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);

    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), NULL);

    GMenu *menubar = g_menu_new();
    GMenuItem *menu_item_menu = g_menu_item_new("File", NULL);
    GMenu *menu = g_menu_new();
    GMenuItem *menu_item_connect = g_menu_item_new("Connect", "app.connect");
    g_menu_append_item(menu, menu_item_connect);
    g_object_unref(menu_item_connect);
    g_menu_item_set_submenu(menu_item_menu, G_MENU_MODEL(menu));
    g_menu_append_item(menubar, menu_item_menu);
    g_object_unref(menu_item_menu);

    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;
}

【问题讨论】:

  • OSX-豹?!?这是一个相关的标签吗?

标签: c macos macos-mojave gtk4


【解决方案1】:

首先让我们从你的connect回调函数开始,它的原型应该是这样的:

static void connect ( GSimpleAction *simple_action, GVariant *parameter, gpointer *data 

在那之后,你有一个小问题,你很好。 在这一行:

GSimpleAction *act_connect = g_simple_action_new("Connect", NULL);

这是您的第一个参数"Connect"

在这一行:

GMenuItem *menu_item_connect = g_menu_item_new("Connect", "app.connect");

第二个参数是"app.connect",现在如果你比较"Connect""app.connect"你会发现错误。

区分大小写,只需将"Connect" 替换为"connect" 就可以了。

现在你的问题,你需要另一个菜单,试着理解下面的演示:

#include <gtk/gtk.h>

static void action_clbk ( GSimpleAction *simple_action, G_GNUC_UNUSED GVariant *parameter, G_GNUC_UNUSED gpointer *data )
{
    g_print ( "The action %s was clicked.\n", g_action_get_name ( G_ACTION ( simple_action ) ) );
}

static void activate ( GApplication *app, G_GNUC_UNUSED gpointer *data )
{
    GtkWidget *win;
    GSimpleAction *act_connect;
    GSimpleAction *act_disconnect;

    /// ***
    GMenu *menu_bar;
    GMenu *network_menu;
    GMenu *server_menu;

    /// ***
    GMenuItem *menu_item_connect;
    GMenuItem *menu_item_disconnect;

    /// *** Menu Bar
    menu_bar = g_menu_new();

    /// *** Network_Menu
    network_menu = g_menu_new();
    g_menu_append_submenu ( menu_bar, "Network", G_MENU_MODEL ( network_menu ) );

    /// *** Server_Menu
    server_menu = g_menu_new();
    g_menu_append_submenu ( network_menu, "Server", G_MENU_MODEL ( server_menu ) );
    /// ***
    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 ), 400, 400 );

    /// *** Create Connect and Disconnect Actions
    act_connect    = g_simple_action_new ( "connect", NULL );
    act_disconnect = g_simple_action_new ( "disconnect", NULL );

    /// *** Add them to the ActionMap
    g_action_map_add_action ( G_ACTION_MAP ( app ), G_ACTION ( act_connect ) );
    g_action_map_add_action ( G_ACTION_MAP ( app ), G_ACTION ( act_disconnect ) );

    /// *** Connect them to the activate Signal
    g_signal_connect ( act_connect,    "activate", G_CALLBACK ( action_clbk ), NULL );
    g_signal_connect ( act_disconnect, "activate", G_CALLBACK ( action_clbk ), NULL );

    /// *** Create the Connect Item
    menu_item_connect = g_menu_item_new ( "Connect", "app.connect" );
    g_menu_append_item ( server_menu, menu_item_connect );

    /// *** Create the Disconnect Item
    menu_item_disconnect = g_menu_item_new ( "Disconnect", "app.disconnect" );
    g_menu_append_item ( server_menu, menu_item_disconnect );

    /// ***
    gtk_application_set_menubar             ( GTK_APPLICATION ( app ), G_MENU_MODEL ( menu_bar ) );
    gtk_application_window_set_show_menubar ( GTK_APPLICATION_WINDOW ( win ), TRUE );

    /// ***
    gtk_window_present ( GTK_WINDOW ( win ) );

    /// *** Clean
    g_object_unref ( act_connect );
    g_object_unref ( act_disconnect );
    g_object_unref ( menu_item_connect );
    g_object_unref ( menu_item_disconnect );
    g_object_unref ( server_menu );
    g_object_unref ( network_menu );
    g_object_unref ( menu_bar );
}

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;
}

PS:

如果您需要了解更多关于GMenuActions 工作原理的信息,请联系Click here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 2013-12-24
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    相关资源
    最近更新 更多