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



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

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

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

感谢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);
        }

In the beginning of main, I put the usual GtkBuilder stuff, instantiating a GtkBuilder object and then adding the default / first to be shown menu bar object:

// 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;
}

相关内容

  • 没有找到相关文章

最新更新