迭代 GtkTreeStore 中的项目

问题描述 投票:0回答:0

我的 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)
的演员阵容,但没有成功。

c sqlite gtk3
© www.soinside.com 2019 - 2024. All rights reserved.