如何在GTK3中占据窗口标题下方相同空间的两个菜单栏之间切换?

时间:2015-06-02 15:26:01

标签: gtk3 menubar glade gtkbuilder

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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;
}