C GTK TreeView列标题消失

C GTK TreeView列标题消失,c,gtk,C,Gtk,我有一个程序,可以将文本文件解析成不同的单词,并通过GTK3在树状视图中显示它们加上它们的计数。一列是“Word”,另一列是“Count” 出于某种原因,当文件具有1638个以上的不同“单词”时,即使解析和单词显示正常进行,树视图也不再显示列名。查看屏幕截图 单词存储在结构中: typedef struct Word{ char * _origWord; char * _word; int _number; struct Word * _left;

我有一个程序,可以将文本文件解析成不同的单词,并通过GTK3在树状视图中显示它们加上它们的计数。一列是“Word”,另一列是“Count”

出于某种原因,当文件具有1638个以上的不同“单词”时,即使解析和单词显示正常进行,树视图也不再显示列名。查看屏幕截图

单词存储在结构中:

 typedef struct Word{

     char * _origWord;
     char * _word;
     int _number;
     struct Word * _left;
     struct Word * _right;
     Line * _line;

} Word;
“Line”是另一个用于记录单词出现的行的结构

以下是将每个“单词”添加到GtkTreeStore的代码:

 static void store_words_counts(Word *w, GtkTreeStore *store, GtkTreeIter iter){

     if (w->_word == NULL) return;

     store_words_counts(w->_left, store, iter);

     if (strlen(w->_origWord) > 0 && strAlpha(w->_origWord)){

         gtk_tree_store_append (store, &iter, NULL);

         int length = snprintf( NULL, 0, "%d", w->_number);
         char * number = malloc(length + 1);
         snprintf(number, length + 1, "%d", w->_number);


         gtk_tree_store_set(store, &iter,
                            0, w->_origWord,
                            1, number,
                           -1);


         free(number);
     }

     store_words_counts(w->_right, store, iter);

 }
下面是创建列的代码:

 GtkTreeStore * store = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_STRING);

 /*  Load the data - call to parser */

 load_tree_store(store, contents);

 GtkWidget * tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));

 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
gtk_tree_selection_set_mode(selection, GTK_SELECTION_NONE);

g_object_unref (G_OBJECT (store));

GtkCellRendere *renderer = gtk_cell_renderer_text_new();

GtkTreeViewColumn *column = gtk_tree_view_column_new ();

gtk_tree_view_column_set_title (column, "Word");
gtk_tree_view_column_pack_start (column, renderer, TRUE);
gtk_tree_view_column_set_attributes(column, renderer, "text", 0, NULL);

printf("title is: %s\n", gtk_tree_view_column_get_title(column));

//column = gtk_tree_view_column_new_with_attributes ("Word", renderer,
//                                                   "text", 0,
//                                                   NULL);  
我没有为列编号使用枚举,以便确保正确创建列。我还提出了一种快速创建专栏的方法,并一步一步地完成了。当我在创建和加载列后检查它们的标题时,标题会正确地打印到标准输出

你知道为什么它们在加载一定数量的数据后不进行渲染吗?谢谢


是否从mainloop调用
store\u words\u counts
?否,它是从load\u tree\u store中调用的。load_tree_store确定是显示Word+Count、Word+Lines还是Word+Count+LinesSwell,如果检查它的回溯,是否最终满足
main()
?因为不从mainloop访问gtk是UB,从其他线程调用
gtk_*
函数可能会导致小部件消失。6.7.2.2还承诺了以下内容:
如果第一个枚举数没有=,则其枚举常量的值为0。每个no=的后续枚举数将其枚举常量定义为通过将1添加到前一个枚举常量的值而获得的常量表达式的值
Ow,我在第二个代码片段(很可能是mainloop)中看到了
load\u tree\u store