我喜欢根据按钮或内部状态(使用的COM端口)切换菜单栏。我怎么能在GTK3 +中做到这一点(最好使用Glade和GtkBuilder)? GtkOverlay似乎不是正确的方法。
答案 0 :(得分:0)
将两个菜单栏放在一个gtk(v)框中,然后在Glade中声明其中一个菜单栏是不可见的(默认情况下保留您想要的那个)。然后你可以通过隐藏/显示菜单来切换菜单栏。
请注意,如果您使用的是Ubuntu,则可能会遇到问题。 Ubuntu的Unity将菜单栏移动到工作区的顶部,它可能不满意现有的两个菜单栏。在几年前我做的一个程序中,Ubuntu拒绝显示第二个菜单(但是我并没有隐藏它们中的任何一个,所以你可能很幸运。)
答案 1 :(得分:0)
感谢jcoppens的答案,但我不确定解决方案如何看待所有,垂直框中的一个位置不可见但仍占用空间/一个菜单栏的高度。这不会在标题和菜单栏(第一个菜单栏可见)或菜单栏和下面的容器(第二个菜单栏可见)之间产生间隙吗?
我解决了(在我看到你的回答之前):
/**
* 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;
}