C 和 GTK3 - 使用 Glade 时不显示应用程序菜单

Posted

技术标签:

【中文标题】C 和 GTK3 - 使用 Glade 时不显示应用程序菜单【英文标题】:C and GTK3 - Application menu not showing when using Glade 【发布时间】:2017-05-12 20:46:08 【问题描述】:

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

生成的应用程序菜单:

预期的应用程序菜单:

我相信这与我没有调用应用程序窗口构造​​函数有关,因为它是使用 GtkBuilder 或类似的东西创建的。

对我能做什么有什么想法吗?

【问题讨论】:

查看example。看来你必须继承 GtkApplicationWindow 和 GtkApplication。 @JoséFonte 如果我使用gtk_application_window_new(app) 而不是GtkBuilder,它将按预期工作 @libforce 的一致性我建议在问题上编辑相同的代码。谢谢 【参考方案1】:

问题出在 ui builder 文件中,可见标志设置为 true:

(应用程序)窗口必须分配一个 GtkApplication 实例 之前显示

因此,将 builder.ui Visible 属性设置为 False:

<property name="visible">False</property>

由于没有显示窗口,您必须在设置应用程序后手动执行此操作,例如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);

【讨论】:

@libforce 感谢您的编辑,我保留了与原始代码相同的代码。目的是解决问题而不是更正代码。谢谢,一切顺利。 事实上,我在编辑后 看到了原始代码中的内容;),但它仍然是一个有用的学习功能。干杯:) @liberforce (void)userdata 不是更标准吗?就像不依赖 gcc 扩展一样? @ErikW:当然,如果编译器不是 gcc,它将无法工作。但我喜欢清晰和语义。强制转换未使用的变量并不能说明为什么要这样做。使用说明它是因为它未使用的东西可以提供更好的代码。如果您不使用 gcc,您仍然可以重新定义宏或搜索并替换它,这是您无法通过简单的强制转换完成的。 @JoséFonte 是的!我看过几篇“HowDoI”的文章,都非常好。也许有时我会在其中添加一些这些细节。我确实在 IRC 上得到了一些很大的帮助,但是无论是否有知道答案的人都在那里,但有时不是帮助,而是“但是你为什么要这样做?”......这是通常是一个公平的问题,但有时它只是妨碍。 :P

以上是关于C 和 GTK3 - 使用 Glade 时不显示应用程序菜单的主要内容,如果未能解决你的问题,请参考以下文章

ruby 如何在Ruby Gtk3中使用Glade资源

如何读出 gtk3 对象的“glade ID”

如果使用 Glade 进行绘图,GtkDrawingArea 不会更新

Go版GTK:glade

如何在 GTK3 和 Python 2.7 中的图像对象上创建“点击事件”

垂直方向的 Gtk3+ Spinbutton (c/c++)