GtkTreeView 在 GtkBox 中时不显示所有行

GtkTreeView does not show all rows when in a GtkBox

我有以下 MWE:

#include <gtk/gtk.h>

//#define USE_BOX

int main(int argc, char *argv[]) {
    gtk_init(&argc, &argv);

    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    GtkTreeStore *ts = gtk_tree_store_new(1, G_TYPE_STRING);
    GtkWidget *tv = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ts));
    GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
    gtk_tree_view_insert_column_with_attributes(
        GTK_TREE_VIEW(tv), -1, "title", renderer, "text", 0, NULL
    );
    gtk_window_set_default_size(GTK_WINDOW(window), 500, 400);

#ifdef USE_BOX
    GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
    GtkWidget *label = gtk_label_new("label");
    gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(box), tv, FALSE, FALSE, 0);
    gtk_container_add(GTK_CONTAINER(window), box);
    gtk_widget_show(label);
    gtk_widget_show(box);
#else
    gtk_container_add(GTK_CONTAINER(window), tv);
#endif

    GtkTreeIter iter;
    GtkTreeIter subiter;
    gtk_tree_store_append(ts, &iter, NULL);
    gtk_tree_store_set(ts, &iter, 0, "1", -1);
    gtk_tree_store_append(ts, &subiter, &iter);
    gtk_tree_store_set(ts, &subiter, 0, "1.1", -1);
    gtk_tree_store_append(ts, &subiter, &iter);
    gtk_tree_store_set(ts, &subiter, 0, "1.2", -1);
    gtk_tree_store_append(ts, &subiter, &iter);
    gtk_tree_store_set(ts, &subiter, 0, "1.3", -1);
    gtk_tree_store_append(ts, &subiter, &iter);
    gtk_tree_store_set(ts, &subiter, 0, "1.4", -1);
    gtk_tree_store_append(ts, &subiter, &iter);
    gtk_tree_store_set(ts, &subiter, 0, "1.5", -1);

    gtk_tree_store_append(ts, &iter, NULL);
    gtk_tree_store_set(ts, &iter, 0, "2", -1);
    gtk_tree_store_append(ts, &subiter, &iter);
    gtk_tree_store_set(ts, &subiter, 0, "2.1", -1);
    gtk_tree_store_append(ts, &subiter, &iter);
    gtk_tree_store_set(ts, &subiter, 0, "2.2", -1);
    gtk_tree_store_append(ts, &subiter, &iter);
    gtk_tree_store_set(ts, &subiter, 0, "2.3", -1);

    gtk_widget_show(tv);
    gtk_widget_show(window);
    gtk_main();

    return 0;
}

现在在这段代码中,如果 USE_BOX 没有定义(如上所示),那么一切都会按预期进行。但是如果我们定义 USE_BOX 使得 GtkTreeView 被放置在一个 GtkBox 中,那么我们有以下问题:

起初,window 看起来很正常:

但是当我点击“1”旁边的 "triangle" 展开行时,一些子项(以及“2”行)丢失了:

我希望它显示什么(即未放置在 GtkBox 中时的行为):

我是不是做错了什么,或者这是 GTK+ 中的某种错误?

我试过使用 GtkGrid 而不是 GtkBox,但结果是一样的。但是,在这两种情况下,如果我在“1”行之前展开“2”行,那么一切都会按预期进行。

如果重要,我使用以下编译文件:

 gcc -g -std=c99 -Wall -Wpedantic `pkg-config --cflags gtk+-3.0 gmodule-2.0` ./mwe.c -o ./mwe `pkg-config --libs gtk+-3.0 gmodule-2.0`

一般来说,如果您在 expandfill 都设置为 FALSE 的情况下调用 gtk_box_pack_start(),则子窗口小部件将尽可能少地使用 space。我不完全确定当行被扩展时 TreeView 应该做什么......行为中确实可能存在错误,因为它看起来不一致。

不过,您几乎肯定想做

gtk_box_pack_start(GTK_BOX(box), tv, TRUE, TRUE, 0);

相反。这样 TreeView 扩展到所有可用的垂直 space。如果您认为展开的行可能无法立即放入视口中,您可能还想将 TreeView 放在 ScrolledWindow 中——正如您所见,TreeView 本身没有滚动条。