[英][GTK4][C] How should actions connect with menu items?
I'm making an application using GTK4 in C language.我正在使用 C 语言中的 GTK4 制作一个应用程序。 I'm trying to connect some actions with menu items but such items are inactive, ie, they are not clickable while they appear.
我试图将一些操作与菜单项联系起来,但这些项是非活动的,即它们在出现时不可点击。 I don't know a way to solve this problem so any help are appreciated.
我不知道解决这个问题的方法,所以任何帮助表示赞赏。
A part of code is below.部分代码如下。
#include <gtk/gtk.h>
int main(int argc, char **argv)
{
int status;
application = gtk_application_new("gtk.example", G_APPLICATION_FLAGS_NONE);
g_signal_connect_swapped(application, "active" G_CALL_BACK(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 = 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");
}
The result I got is below.我得到的结果如下。 Close is not clickable.
关闭是不可点击的。
There are so many problems with your code, that I have no Idea where I should start with.你的代码有很多问题,我不知道应该从哪里开始。
Anyway, the main problem (but not the only one) it is here:无论如何,主要问题(但不是唯一的)就在这里:
const GActionEntry entries[] =
{
{"close", quit}
};
It should be like this:应该是这样的:
const GActionEntry entries[] =
{
{"close", quit, NULL, NULL, NULL, { 0, 0, 0 } }
};
Here is a working program :这是一个工作程序:
#include <gtk/gtk.h>
void create_window ( GtkApplication *application );
static void quit ( GSimpleAction *action, GVariant *parameter, gpointer data );
int main ( int argc, char **argv )
{
GtkApplication *application;
int status;
/// ***
application = gtk_application_new ( "gtk.example", G_APPLICATION_FLAGS_NONE );
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 )
{
GtkWidget *window;
GMenu *menubar;
GMenu *menu;
GMenuItem *item;
/// ***
window = gtk_application_window_new ( application );
gtk_window_set_application ( GTK_WINDOW ( window ), application );
/// ***
const GActionEntry entries[] =
{
{"close", quit, NULL, NULL, NULL, { 0, 0, 0 } }
};
/// **
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, G_GNUC_UNUSED GVariant *parameter, G_GNUC_UNUSED gpointer data )
{
g_print ( "You choose `%s` action\n", g_action_get_name ( G_ACTION( action ) ) );
}
I am strongly suggesting you to check these Videos .我强烈建议您查看这些视频。
By the way, there is not active
Signal, you need activate
instead.顺便说一句,没有
active
信号,您需要activate
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.