我有以下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中,那么我们就会遇到以下问题:
首先,窗口看起来很正常:
但是当我点击“1”旁边的“三角形”展开行时,一些孩子(以及“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`
答案 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没有自己的滚动条。