我有以下问题。我正在开发一个应用程序,它使用 gtktreeview
来显示从 MySQL 数据库检索到的数据。
我已经完成了几个 gtktreeview
的示例,我能够从列表中添加、清除和删除。现在我想将这个示例应用到我的应用程序中,但突然间它不再起作用了。
这是我使用的示例,它有效。
枚举:
static enum {
FIRST_NAME,
LAST_NAME,
N_COL
};
变量:
static GtkWidget *list;
static GtkWidget *f_entry;
static GtkWidget *l_entry;
列表的设置:
static GtkWidget *setup_list()
{
GtkWidget *sc_win;
GtkListStore *store;
GtkCellRenderer *cell;
GtkTreeViewColumn *column;
sc_win = gtk_scrolled_window_new(NULL, NULL);
gtk_widget_set_usize(sc_win, 250, 150);
store = gtk_list_store_new(N_COL, G_TYPE_STRING, G_TYPE_STRING);
list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
cell = gtk_cell_renderer_text_new();
// column of the names
column = gtk_tree_view_column_new_with_attributes("Imię", cell, "text", FIRST_NAME, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
// column of the surnames
column = gtk_tree_view_column_new_with_attributes("Nazwisko", cell, "text", LAST_NAME, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
// scrolls
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sc_win), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(sc_win), list);
// free the store variable and return the scrolled window pointer
g_object_unref(G_OBJECT(store));
return sc_win;
}
添加元素的函数:
static void list_add_cb(GtkWidget* widget, gpointer data)
{
GtkListStore *store;
GtkTreeIter iter;
const char *first;
const char *last;
first = gtk_entry_get_text(GTK_ENTRY(f_entry));
last = gtk_entry_get_text(GTK_ENTRY(l_entry));
store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list)));
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, FIRST_NAME, first, LAST_NAME, last, -1);
}
这是我的应用程序中的等效项。
枚举:
enum {
ID_ALIAS,
N_COL
};
变量(仅对示例有意义的变量):
static GtkWidget *list_pas;
static GtkWidget *list_key;
列表的设置(几乎相同,除了在参数中传递列名和仅使用一列):
static GtkWidget *setup_list(char *typ)
{
GtkWidget *sc_win;
GtkWidget *list;
GtkListStore *store;
GtkCellRenderer *cell;
GtkTreeViewColumn *column;
sc_win = gtk_scrolled_window_new(NULL, NULL);
gtk_widget_set_usize(sc_win, 250, 150);
store = gtk_list_store_new(N_COL, G_TYPE_STRING, G_TYPE_STRING);
list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
cell = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(typ, cell, "text", ID_ALIAS, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
// scrolls
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sc_win), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(sc_win), list);
// free the store variable and return the scrolled window pointer
g_object_unref(G_OBJECT(store));
return sc_win;
}
添加元素的函数(在 data
中有一个要添加到列表中的元素的字符串,在 widget
中有包含适当列表的滚动窗口):
static void list_add_cb(GtkWidget* widget, gpointer data)
{
GtkListStore *store;
GtkTreeIter iter;
store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(widget)));
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, ID_ALIAS, (char *) data*, -1);
}
它不起作用,因为每次 MySQL 函数尝试在其字段中写入数据时都会出现以下错误:
(app_0:3642): GLib-GObject-WARNING **: invalid cast from `GtkScrolledWindow' to `GtkTreeView'
(app_0:3642): Gtk-CRITICAL **: IA__gtk_tree_view_get_model: assertion `GTK_IS_TREE_VIEW (tree_view)' failed
(app_0:3642): Gtk-CRITICAL **: IA__gtk_list_store_append: assertion `GTK_IS_LIST_STORE (list_store)' failed
(app_0:3642): Gtk-CRITICAL **: IA__gtk_list_store_set_valist: assertion `GTK_IS_LIST_STORE (list_store)' failed
添加一行的函数是这样调用的:
list_add_cb(list, row[i] ? row[i] : "NULL");
我还会说当我打印 row[i] 时? row[i] : "NULL"
我得到正确的值。
我的应用程序的 MySQL 部分运行良好。我在编译时得到的唯一警告是 useless class storage specifier in empty declaration
我在 stackoverflow.com 上进行了研究,我了解到这与此问题无关。
另一个区别是我在我的应用程序中创建了多个列表。为了验证这是否是问题的根源,我删除了除一个列表之外的所有列表,这没有任何改变。
我也一直在尝试为列表添加输入字段和按钮触发器,但这并没有改变任何东西。我还尝试用枚举重新排序变量的声明,这对结果也没有影响。
我没有找到任何有用的东西,我没有想法,请帮忙。我一直在努力尽可能清楚地解释这一点,请提出问题并纠正我和我的帖子。谢谢。
最佳答案
我找到了解决方案。不幸的是,我不知道为什么它能解决问题。
正如用户 ntd 在评论中所说,我使用 GtkScrolledWindow
来附加列表,我虽然没问题,因为在示例中就是这样,但在示例中有辅助变量,而不是全局变量main
我没有注意到的函数。所以谢谢你的观点。
第二件事是使用多个列表。函数 static GtkWidget *setup_list(char *typ)
必须加倍。有趣的是,我无法在该函数的参数中传递 gtktreeview
对象,但是一旦我创建了两个函数 setup_list(char *typ)
和 setup_list2(char *typ)
其中唯一的区别是用于存储 gtktreeview
的变量。
我真的不知道为什么它会这样工作,如果有人有想法,我会很乐意学习。反正我很高兴,因为我的项目现在可以走得更远了。大家干杯!
关于c - gtktreeview 在示例中工作正常,但一旦复制到应用程序中就会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16984247/