在调整整个窗口大小之前,为什么我的GtkBox不更新?

时间:2019-12-17 01:12:01

标签: gtk3

将菜单附加到窗口时,我将分离现有的根控件,添加一个垂直的GtkBox来容纳菜单和根控件,然后将该框附加到GtkWindow like so

Gtk::GtkWidget *menubar = GTK_WIDGET(Info.obj);

Wnd->_VBox = Gtk::gtk_box_new(Gtk::GTK_ORIENTATION_VERTICAL, 0);

Gtk::GtkBox *vbox = GTK_BOX(Wnd->_VBox);
Gtk::GtkContainer *wndcontainer = GTK_CONTAINER(Wnd->Wnd);

g_object_ref(Wnd->_Root);

gtk_container_remove(wndcontainer, Wnd->_Root);
gtk_box_pack_start(vbox, menubar, false, false, 0);
gtk_box_pack_end(vbox, Wnd->_Root, true, true, 0);
gtk_container_add(wndcontainer, Wnd->_VBox);

gtk_widget_show_all(GTK_WIDGET(Wnd->Wnd));

g_object_unref(Wnd->_Root);

gtk_window_add_accel_group(Wnd->Wnd, AccelGrp);

在实践中,它看起来像这样:

https://i.imgur.com/LtzQEHu.gifv

我想要的是菜单自动显示在正确的位置,而无需调整窗口大小以强制布局更新。

我尝试在窗口上调用gtk_widget_queue_draw,但这没什么区别。我在这里做错什么了吗?可以调用额外的功能来使布局无效并使其刷新吗?

2 个答案:

答案 0 :(得分:1)

如果没有minimal reproducible example,很难回答。您的代码甚至不是普通的GTK或gtkmm ...这似乎是两者之间的某种异国情调。

这是我的尝试:我试图尽可能地接近您的代码。不过,您所描述的问题不存在。

/* gcc -o test test.c $(pkg-config --cflags --libs gtk+-3.0) */
#include <gtk/gtk.h>

static GMenu *
menu_model(void)
{
    GMenu *menu = g_menu_new();
    g_menu_append(menu, "File", NULL);
    g_menu_append(menu, "Edit", NULL);
    g_menu_append(menu, "Project", NULL);
    /* ... */
    return menu;
}

int main(int argc, char **argv)
{
    GtkWidget *window;
    GMenuModel *model;
    GtkWidget *menubar;
    GtkWidget *content;
    GtkWidget *vbox;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    model = G_MENU_MODEL(menu_model());
    menubar = gtk_menu_bar_new_from_model(model);
    g_object_unref(model);

    content = gtk_label_new("Some content here");

    vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
    gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
    gtk_box_pack_end(GTK_BOX(vbox), content, TRUE, TRUE, 0);
    gtk_container_add(GTK_CONTAINER(window), vbox);

    gtk_widget_show_all(GTK_WIDGET(window));
    gtk_main();
    return 0;
}

答案 1 :(得分:0)

因此,它应该开箱即用。实际上,在我的Raspberry Pi上,代码确实可以完成预期的工作,这在我的Ubuntu 18 VM上仍然是一个问题。我发现有一些解决方法可以使GtkBox重新配置子小部件的布局:

GdkRectangle allocation = Wnd->GetClient();
g_signal_emit_by_name(G_OBJECT(vbox), "size-allocate", GTK_WIDGET(vbox), &allocation, NULL, NULL);

菜单现在自动出现在正确的位置。看起来像“黑客”,将来可能会停止工作或在某些系统上崩溃? IDK。但是就目前和Ubuntu 18而言,我没有什么比这更好的了。