我喜欢根据按钮或内部状态(使用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;
}