用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的方式可以更好的进行控制。

TAGS:C,GTK,GValue

15 COMMENTS >>LEAVE<<

  1. xbox

    这篇文章太好了,在网上找了很久就是没找到怎么用GTK来实现像Exel那样的表格来显示数据库

  2. ABitNo
    @xbox

    谢谢。我也是在网上找了很久都没找到。还是自己慢慢看文档看出来的。。。

  3. 孤傲的小王子

    贵站不错..内容不错. .IP已送.希望能够回访. 顺便做做链接.大家彼此多多链接..

    孤傲的小王子
    http://www.nyltw.com

    链接已经做好..

  4. 风也飘泊

    完全看不懂...像天书一样

    PS:你的网站描述,什么都略懂一点,生活就多彩一些,我一个同事经常挂在嘴边,哈哈

  5. ABitNo
    @风也飘泊

    哈哈。。。谢谢啊。。。

  6. ABitNo
    @孤傲的小王子

    谢谢。。。孤傲的小王子也是相当不错,内容丰富。。。
    不过内容与ABitNo的不是很相关啊。。。再就是“转载某淫牛的AV种子“的内容也太丰富了。。。

  7. 安逸时代

    刚好做毕业设计,用一下!!

  8. ABitNo
    @安逸时代

    哈哈。。。做毕业设计用GTK不错。。。

  9. davy

    专业的不太懂....只偶尔玩玩ubuntu。

    喜欢新鲜玩意、资讯的,欢迎回访!

  10. ABitNo
    @davy

    回访了,你的博客内容很新奇吗。。。我也喜欢那些新鲜玩意。。。

  11. richard_ma

    我的毕业论文是用GTK+的一个sniffer,你的这个系统不错,考没考虑做一个教务的开源软件?

  12. ABitNo
    @richard_ma

    哈哈,正有此意,不过现在的能力不够,时间会长点。。。

  13. 米修

    能否共享您自己实现的那个完整代码?

  14. ABitNo
    @米修

    啊,完整代码全都不见了。。。

  15. wwx024
    @ABitNo

    能不能给一个完整的treeview显示Mysql数据表的例子代码,我也开始学GTK,是个超级菜鸟,你的方法很好,因为表格在显示之前并不知道要显示的数据是多少列多少行,但你只写出了部分代码,能不能共享一个完整的代码?期待。。。

LEAVE A RESPONSE >>CANCEL<<

loader