我的 Gtk3 应用程序从 SQLite 数据库读取数据并填充 GtkTreeView (GtkTreeStore)。树视图(应该是)根级别的年(YYYY,字符串)元素列表,以月(MM,字符串)作为子节点:
2000
- 03
- 04
2005
- 01
- 02
- 03
- 04
...
桌子:
CREATE TABLE IF NOT EXISTS year_months (
id INTEGER PRIMARY KEY AUTOINCREMENT,
year TEXT NOT NULL,
month TEXT NOT NULL,
UNIQUE (year, month)
);
INSERT INTO year_months (year, month) VALUES ('2023', '08');
INSERT INTO year_months (year, month) VALUES ('2023', '01');
INSERT INTO year_months (year, month) VALUES ('2023', '02');
INSERT INTO year_months (year, month) VALUES ('2023', '03');
INSERT INTO year_months (year, month) VALUES ('2023', '04');
INSERT INTO year_months (year, month) VALUES ('2023', '05');
INSERT INTO year_months (year, month) VALUES ('2023', '06');
INSERT INTO year_months (year, month) VALUES ('2023', '07');
INSERT INTO year_months (year, month) VALUES ('2023', '09');
INSERT INTO year_months (year, month) VALUES ('2023', '10');
INSERT INTO year_months (year, month) VALUES ('2022', '10');
INSERT INTO year_months (year, month) VALUES ('2022', '05');
INSERT INTO year_months (year, month) VALUES ('2022', '07');
INSERT INTO year_months (year, month) VALUES ('2022', '09');
SELECT * FROM year_months;
有效。我的树视图现在看起来像:
2023
- 08
2023
- 01
2023
- 02
2023
- 03
...
在
sqlite3_exec()
回调函数(为每一行调用)中,我迭代树(存储)中的每个元素,以检查是否已经存在与获取的行具有相同年份的节点。我将新行附加为现有年份元素的子元素(如果之前已将其添加到树中),或者根据需要创建一个新的顶级节点:
int populate_treeview(void *model, int argc, char **argv, char **azColName) {
GtkTreeIter iter2;
gboolean valid = gtk_tree_model_get_iter_first(model, &iter2);
gchararray myval;
int match = 0;
while (valid)
{
gtk_tree_model_get(GTK_TREE_MODEL(model), &iter2, YM_YEAR, &myval, -1);
printf("myval = %s\n", myval);
if (!strcmp(myval, argv[1])) {
gtk_tree_store_append(GTK_TREE_STORE(model), &iter2, &iter2);
gtk_tree_store_set(GTK_TREE_STORE(model), &iter2, YM_YEAR, argv[1], -1);
gtk_tree_store_set(GTK_TREE_STORE(model), &iter2, YM_MONTH, argv[2], -1);
match = 1;
free(myval);
continue;
}
free(myval);
valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter2);
}
if (!match) {
// new year
gtk_tree_store_append(GTK_TREE_STORE(model), &iter2, NULL);
gtk_tree_store_set (GTK_TREE_STORE(model), &iter2, YM_YEAR, argv[1], -1);
gtk_tree_store_set (GTK_TREE_STORE(model), &iter2, YM_MONTH, argv[2], -1);
}
return 0;
}
在回调函数中(在添加 while 循环之前)调用
gtk_tree_store_append(GTK_TREE_STORE(model), &iter2, NULL);
有效,所以我知道 model
已正确设置。但是,该代码会导致 get_tree_model_iter_get_first()
: 出现段错误
(PCG:8309): Gtk-WARNING **: 19:54:44.026: gtktreestore.c:338: Invalid type (null)
(PCG:8309): Gtk-CRITICAL **: 19:54:44.027: gtk_tree_model_get_iter_first: assertion 'GTK_IS_TREE_MODEL (tree_model)' failed
我尝试了模型
GTK_TREE_STORE(model)
和GTK_TREE_MODEL(model)
的演员阵容,但没有成功。