GtkTreeView在GtkBox中不显示所有行

时间:2015-02-08 17:12:10

标签: c gtk gtk3

我有以下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中,那么我们就会遇到以下问题:

首先,窗口看起来很正常:

normal window

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

missing rows

我期望它显示的内容(即未放入GtkBox时的行为):

expected behaviour

我在这里做错了什么,或者这是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`

1 个答案:

答案 0 :(得分:1)

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

但是,你几乎肯定想做

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

代替。这样,TreeView扩展到所有可用的垂直空间。如果您认为扩展的行可能不会立即适合视口,您可能还希望将TreeView放在ScrolledWindow中 - 因为您已经看到TreeView没有自己的滚动条。