gpt4 book ai didi

c - GtkTreeView 在 GtkBox 中时不显示所有行

转载 作者:太空宇宙 更新时间:2023-11-04 03:41:17 24 4
gpt4 key购买 nike

我有以下 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”旁边的“三角形”来展开行时,一些 child (以及“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`

最佳答案

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

不过,你几乎肯定想做

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

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

关于c - GtkTreeView 在 GtkBox 中时不显示所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28396818/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com