C 和 GTK3 - 使用 Glade 时不显示应用程序菜单
C and GTK3 - Application menu not showing when using Glade
我在使用 Glade (GtkBuilder) 时无法显示正确的应用程序菜单。这是我目前使用的代码:
main.c:
void app_init(GtkApplication* app, void* userdata)
{
(void)userdata;
GActionEntry appactions[] = {
{"about", app_aboutaction, NULL, NULL, NULL, {0}},
{"quit", app_quitaction, NULL, NULL, NULL, {0}},
};
g_action_map_add_action_entries(
G_ACTION_MAP(app),
appactions,
sizeof appactions / sizeof *appactions,
app
);
GMenu* menu = g_menu_new();
g_menu_append(menu, "About", "app.about");
g_menu_append(menu, "Quit", "app.quit");
gtk_application_set_app_menu(app, G_MENU_MODEL(menu));
}
void app_ctor(GtkApplication* app, void* userdata)
{
(void)userdata;
GtkBuilder* builder = gtk_builder_new_from_file("./builder.ui");
GtkWindow* appwin = GTK_WINDOW(gtk_builder_get_object(builder, "window"));
gtk_window_set_application(appwin, app);
}
int main(int argc, char* argv[])
{
GtkApplication* app = gtk_application_new(NULL, G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "startup", G_CALLBACK(app_init), NULL);
g_signal_connect(app, "activate", G_CALLBACK(app_ctor), NULL);
return g_application_run(G_APPLICATION(app), argc, argv);
}
builder.ui:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.0 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkApplicationWindow" id="window">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
</interface>
生成的应用程序菜单:
预期的应用程序菜单:
我认为这与我没有调用应用程序 window 构造函数有关,因为它是使用 GtkBuilder 或类似的东西创建的。
对我能做什么有什么想法吗?
问题出在可见标志设置为 true 的 ui builder 文件中:
a (application) window has to have a GtkApplication instance assigned
before it's shown
因此,将 builder.ui 可见 属性 设置为 False:
<property name="visible">False</property>
由于没有显示window,您必须在设置应用程序后手动进行,例如gtk_window_present:
void app_ctor(GtkApplication* app, G_GNUC_UNUSED gpointer user_data)
{
GtkBuilder* builder = gtk_builder_new_from_file("./builder.ui");
GtkWindow* appwin = GTK_WINDOW(gtk_builder_get_object(builder, "window"));
gtk_window_set_application(appwin, app);
gtk_window_present(appwin);
}
我在使用 Glade (GtkBuilder) 时无法显示正确的应用程序菜单。这是我目前使用的代码:
main.c:
void app_init(GtkApplication* app, void* userdata)
{
(void)userdata;
GActionEntry appactions[] = {
{"about", app_aboutaction, NULL, NULL, NULL, {0}},
{"quit", app_quitaction, NULL, NULL, NULL, {0}},
};
g_action_map_add_action_entries(
G_ACTION_MAP(app),
appactions,
sizeof appactions / sizeof *appactions,
app
);
GMenu* menu = g_menu_new();
g_menu_append(menu, "About", "app.about");
g_menu_append(menu, "Quit", "app.quit");
gtk_application_set_app_menu(app, G_MENU_MODEL(menu));
}
void app_ctor(GtkApplication* app, void* userdata)
{
(void)userdata;
GtkBuilder* builder = gtk_builder_new_from_file("./builder.ui");
GtkWindow* appwin = GTK_WINDOW(gtk_builder_get_object(builder, "window"));
gtk_window_set_application(appwin, app);
}
int main(int argc, char* argv[])
{
GtkApplication* app = gtk_application_new(NULL, G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "startup", G_CALLBACK(app_init), NULL);
g_signal_connect(app, "activate", G_CALLBACK(app_ctor), NULL);
return g_application_run(G_APPLICATION(app), argc, argv);
}
builder.ui:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.0 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkApplicationWindow" id="window">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
</interface>
生成的应用程序菜单:
预期的应用程序菜单:
我认为这与我没有调用应用程序 window 构造函数有关,因为它是使用 GtkBuilder 或类似的东西创建的。
对我能做什么有什么想法吗?
问题出在可见标志设置为 true 的 ui builder 文件中:
a (application) window has to have a GtkApplication instance assigned before it's shown
因此,将 builder.ui 可见 属性 设置为 False:
<property name="visible">False</property>
由于没有显示window,您必须在设置应用程序后手动进行,例如gtk_window_present:
void app_ctor(GtkApplication* app, G_GNUC_UNUSED gpointer user_data)
{
GtkBuilder* builder = gtk_builder_new_from_file("./builder.ui");
GtkWindow* appwin = GTK_WINDOW(gtk_builder_get_object(builder, "window"));
gtk_window_set_application(appwin, app);
gtk_window_present(appwin);
}