0

我喜欢根据按钮或内部状态(使用的 COM 端口)切换菜单栏。我如何在 GTK3+ 中做到这一点(最好使用 Glade 和 GtkBuilder)?GtkOverlay 似乎不是正确的方法。

4

2 回答 2

0

将两个菜单栏放在一个 gtk(v) 框中,然后在 Glade 中将其中一个菜单栏声明为不可见(默认情况下让您想要的那个可见)。然后您可以稍后通过隐藏/显示它们来切换菜单栏。

请注意,如果您使用的是 Ubuntu,您可能会遇到问题。Ubuntu 的 Unity 将菜单栏移动到工作区的顶部,它可能对仅存在的两个菜单栏不满意。在我几年前制作的一个程序中,Ubuntu 拒绝显示第二个菜单(但我没有隐藏其中任何一个,所以你可能很幸运)。

于 2015-06-03T03:47:01.513 回答
0

感谢 jcoppens 的回答,但我不确定解决方案将如何看待所有垂直框中的位置之一不可见但仍占用空间/一个菜单栏的高度。这不会在标题和菜单栏(第一个菜单栏可见)或菜单栏和下面的容器(第二个菜单栏可见)之间产生间隙吗?

我解决了它(在我看到你的答案之前):

  • 使用 Glade,创建一个新文件并将两个菜单栏放在那里。
  • 在主窗口的 Glade 文件中,创建一个垂直框,其中一个项目位于标题正下方。(在我的例子中,我的主框架包含一个包含三个项目的垂直框,第一个位置保持为空并将包含两个菜单栏之一,第二个包含另一个容器中的所有其他项目,第三个项目包含一个状态酒吧。)
  • 在使用 GtkBuilder 的 C 模块中,我切换菜单栏如下图:


    /**
     * This function adds or replaces the menu bar.
     * @param id id string for menu bar
     */
        void amci_tester_set_menubar(const gchar *id) {
            GtkWidget *menu_bar = GTK_WIDGET(gtk_builder_get_object(builder, id));
            GtkBox *box_menu = GTK_BOX(gtk_builder_get_object(builder, "boxMainMenu"));
            GList *children = gtk_container_get_children(GTK_CONTAINER(box_menu));
            if (children != NULL)
                gtk_container_remove(GTK_CONTAINER(box_menu), (GtkWidget *) g_list_first(children)->data);
            gtk_box_pack_start(box_menu, menu_bar, false, false, 0);
            // Although the visible property is shown as being set in the Glade GUI, in
            // the Glade file it is not set.
            gtk_widget_set_visible(menu_bar, true);
            g_list_free(children);
        }

在 main 的开头,我放了通常的 GtkBuilder 东西,实例化一个 GtkBuilder 对象,然后添加默认的 / 第一个要显示的菜单栏对象:

// Init GTK+.
gtk_init(&argc, &argv);

// Create new GtkBuilder object from file.
builder = gtk_builder_new_from_file(glade_filename_app);
if (builder == NULL) {
    g_warning("Could not create builder from %s", glade_filename_app);
    return 1;
}
// Add menu bar for PC menu bar (default) from file.
if (!gtk_builder_add_from_file(builder, glade_filename_menu_pc, &error))    {
    g_warning("%s", error->message);
    g_free(error);
    return 1;
}

于 2015-06-05T15:30:07.437 回答