2015-02-08 73 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