2015-02-08 37 views
1

我有以下MWE时:GtkTreeView不显示所有行的GtkBox

#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

我有什么期望它显示(即behav iour不用时放在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

一般来说,如果你叫gtk_box_pack_start()expandfill设置为False,孩子小部件会使用尽可能少的空间,因为它可以。我并不完全确定当行被扩展时TreeView应该做什么......可能确实存在行为上的错误,因为它看起来并不一致。

不过,你几乎可以肯定要做

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

代替。这样TreeView就可以扩展到所有可用的垂直空间。如果您认为展开的行可能不能一次放入视口中,您可能还想将TreeView放入ScrolledWindow中 - 正如您所看到的,TreeView没有自己的滚动条。

+0

哇。其实只需将树视图放入滚动窗口即可解决。 (我想这是因为树视图会填满滚动窗口的所有空间。)非常感谢。 – ace 2015-02-08 18:29:35

+0

将GtkScrolledWindow放入另一个GtkBox后,'expand'和'fill'位仍然很重要。 (或者,您可以在滚动窗口本身设置“hexpand”,“halign”,“vexpand”和“valign”属性;所有GtkWidgets都有这些属性。) – andlabs 2015-02-09 00:12:30