用GTK的GtkTreeView实现表格
本文是用GTK和MySQL完成学生信息管理系统的第三部分
这里不打算讲GTK的基本用法,因为GTK的官方已经有很好的文档了,我比较推荐的是The GTK+ tutorial,上面说的都很详细,另外官方的文档也应该要看一下的。
现在这个程序依然是要用C语言来实现,当然GTK还可以与其他语言(Python, Ruby, C++等)来配合,如果不明白C语言应该也可以看懂其中的含义。下面就列出关键的一段代码
void append_values_to_list(GtkWidget *list, gint *colums, GValue *values, gint num_column) { GtkListStore *store; GtkTreeIter iter; store = GTK_LIST_STORE(gtk_tree_view_get_model (GTK_TREE_VIEW(list))); gtk_list_store_append(store, &iter); gtk_list_store_set_valuesv(store, &iter, colums, values, num_column); }
在这段代码中,ABitNo调用了这样一个方法
gtk_list_store_set_valuesv(store, &iter, colums, values, num_column);
这个函数可以往一个TreeView中添加多列的数据,colums是要添加数据的column的一个数组,values是一个与colums对应的GValue数组,里面包含着要添加的数据。对于GValue的使用ABitNo会在以后的文章中写一下自己的一些用法。
另外,ABitNo对GTK的学习仍然处于入门阶段,刚开始的时候一直没有找到在GTK中实现表格的方式,而做一个数据库系统显示表格又是必须的,所以到LinuxQuestions.org求助,在那里得到了一个答案。不过等ABitNo得到这个答案时,我已经在Dev help中找到了自己的解决办法。这个方法与我自己的实现基本一致,不同之处在于往表格中添加新数据的方式。
下面就把高人给出的代码也列出来
/*File: abitno.c*/ #include <gtk/gtk.h> enum { BUY_IT = 0, QUANTITY, PRODUCT, COLUMNS }; typedef struct { gboolean buy; gint quantity; gchar *product; } GroceryItem; const GroceryItem list[] = { { TRUE, 1, "Paper Towels"}, { TRUE, 2, "Bread"}, { FALSE, 1, "Butter"}, { TRUE, 1, "Milk"}, { FALSE, 3, "Chips"}, { TRUE, 4, "Soda"}, { FALSE, 0, NULL} }; static void setup_tree_view(GtkWidget*); int main(int argc, char *argv[]) { GtkWidget *window, *treeview, *scrolled_win; GtkListStore *store; GtkTreeIter iter; guint i = 0; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "Grocery List"); gtk_container_set_border_width(GTK_CONTAINER(window), 10); gtk_widget_set_size_request(window, 250, 175); treeview = gtk_tree_view_new(); setup_tree_view(treeview); /* * Create a new tree model with three columns, as string, * gint and guint. */ store = gtk_list_store_new(COLUMNS, G_TYPE_BOOLEAN, G_TYPE_INT, G_TYPE_STRING); /* Add all of the products to the GtkListStore. */ while (list[i].product != NULL) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, BUY_IT, list[i].buy, QUANTITY, list[i].quantity, PRODUCT, list[i].product, -1); i++; } /* * Add the tree model to the tree view and unreference it so * that the model will be destroyed along with the tree view. */ gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(store)); g_object_unref(store); scrolled_win = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(scrolled_win), treeview); gtk_container_add(GTK_CONTAINER(window), scrolled_win); gtk_widget_show_all(window); gtk_main(); return 0; } /* Add three columns to the GtkTreeView. All three of the columns will be * displayed as text, although one is a gboolean value and another is * an integer. */ static void setup_tree_view(GtkWidget *treeview) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; /* Create a new GtkCellRendererText, add it to the tree view column * and append the column to the tree view. */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes ("Buy", renderer, "text", BUY_IT, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes ("Count", renderer, "text", QUANTITY, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes ("Product", renderer, "text", PRODUCT, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); }
可以通过下面的命令来编译
gcc abitno.c -o abitno `pkg-config --libs --cflags gtk+-2.0`
以上两种方法都还可以,不过在ABitNo要完成的作业中,我感觉ABitNo自己的这个更好用一些。ABitNo的程序中,SERVER端从MySQL中可以查询出一个結果数组,然后返回到CLIENT,表格在显示之前并不知道要显示的数据是多少列,用ABitNo的方式可以更好的进行控制。
本文基于 署名-非商业性使用-禁止演绎 2.5 中国大陆 发布
15 COMMENTS >>LEAVE<<
-
这篇文章太好了,在网上找了很久就是没找到怎么用GTK来实现像Exel那样的表格来显示数据库
-
@xbox
谢谢。我也是在网上找了很久都没找到。还是自己慢慢看文档看出来的。。。
-
贵站不错..内容不错. .IP已送.希望能够回访. 顺便做做链接.大家彼此多多链接..
孤傲的小王子
http://www.nyltw.com链接已经做好..
-
完全看不懂...像天书一样
PS:你的网站描述,什么都略懂一点,生活就多彩一些,我一个同事经常挂在嘴边,哈哈
-
@风也飘泊
哈哈。。。谢谢啊。。。
-
@孤傲的小王子
谢谢。。。孤傲的小王子也是相当不错,内容丰富。。。
不过内容与ABitNo的不是很相关啊。。。再就是“转载某淫牛的AV种子“的内容也太丰富了。。。 -
刚好做毕业设计,用一下!!
-
@安逸时代
哈哈。。。做毕业设计用GTK不错。。。
-
专业的不太懂....只偶尔玩玩ubuntu。
喜欢新鲜玩意、资讯的,欢迎回访!
-
@davy
回访了,你的博客内容很新奇吗。。。我也喜欢那些新鲜玩意。。。
-
我的毕业论文是用GTK+的一个sniffer,你的这个系统不错,考没考虑做一个教务的开源软件?
-
@richard_ma
哈哈,正有此意,不过现在的能力不够,时间会长点。。。
-
能否共享您自己实现的那个完整代码?
-
@米修
啊,完整代码全都不见了。。。
-
@ABitNo
能不能给一个完整的treeview显示Mysql数据表的例子代码,我也开始学GTK,是个超级菜鸟,你的方法很好,因为表格在显示之前并不知道要显示的数据是多少列多少行,但你只写出了部分代码,能不能共享一个完整的代码?期待。。。