如何通过 Glade3 创建 GtkListview?

How to create the GtkListview by Glade3?

我正在使用 glade3 在 windows 上开发一个简单的应用程序。官方的参考手册好像过时了,所以我用gtk-function创建了Listview,把MySQL-Query结果放到字段行下面。需要有关通过 glade3 而不是代码创建列表视图的帮助。

再次感谢! 我的代码:

#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>
#include "mysql.h"

#define HOST "localhost"
#define USERNAME "root"
#define PASSWORD ""
#define DATABASE "student"

enum ListCols
{
    LIST_NUM,
    LIST_NAME,
    LIST_CHECKED,
    LIST_CNT
};

int main (int argc, char *argv[])
{
    GtkWidget* win;
    GtkWidget* vbox ;
    GtkWidget* statusbar ;
    GtkTreeView* tree;
    GtkTreeView* list;
    GtkTreeStore* tree_store;
    GtkListStore*  list_store;
    GtkTreeIter iter;
    GtkTreeIter iter_child;
    GtkCellRenderer* renderer;
    GtkTreeViewColumn* column;
    GtkTreeSelection* select;

    MYSQL my_connection;
    MYSQL_RES *res_ptr;
    MYSQL_FIELD *field;
    MYSQL_ROW result_row;

    int res;
    int row, col;
    int i, j;
    char * sql = "select * from person;";

    gtk_init (&argc, &argv);
    win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (win), "QueryData");
    gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
    gtk_widget_set_size_request(win, 480, 480);

    vbox = gtk_vbox_new (FALSE, 2);
    gtk_container_add (GTK_CONTAINER (win), vbox);

    list = gtk_tree_view_new();
    list_store = gtk_list_store_new(LIST_CNT,
                                    G_TYPE_STRING, 
                                    G_TYPE_STRING, 
                                    G_TYPE_BOOLEAN);

    mysql_init(&my_connection);
    if (mysql_real_connect(&my_connection, HOST, USERNAME, PASSWORD,DATABASE, 0, NULL, CLIENT_FOUND_ROWS))
    {
        printf("Query data successfully!\n");
        mysql_query(&my_connection, "set names utf8");

        res = mysql_query(&my_connection, sql);
        if (res)
        {
            printf("Error: mysql_query !\n");
            mysql_close(&my_connection);
        }
        else
        {
            res_ptr = mysql_store_result(&my_connection);
            if (res_ptr)
            {
                col = mysql_num_fields(res_ptr);
                row = mysql_num_rows(res_ptr) + 1;

                printf("%d lines queried\n", row);
                for (i = 0; field = mysql_fetch_field(res_ptr); i++)
                    printf("%s ", field->name);
                printf("\n");

                for (i = 1; i < row; i++)
                {
                    result_row = mysql_fetch_row(res_ptr);
                    gtk_list_store_append(list_store, &iter);
                    gtk_list_store_set(list_store, &iter,
                                       LIST_NUM, result_row[0],
                                       LIST_NAME, result_row[2],
                                       LIST_CHECKED, FALSE, -1);
                }
            }
            mysql_close(&my_connection);
        }
    }
    else
        printf("Fail to query data!\n");
    for (int k = 0; k < 3; k++)


    gtk_tree_view_set_model(list, list_store);
    g_object_unref(list_store);

    renderer = gtk_cell_renderer_text_new();
    column = gtk_tree_view_column_new_with_attributes("Name", renderer,
             "text", LIST_NUM, NULL);
    column = gtk_tree_view_append_column(list, column);
    renderer = gtk_cell_renderer_text_new();
    column = gtk_tree_view_column_new_with_attributes("Age", renderer,
             "text", LIST_NAME, NULL);
    column = gtk_tree_view_append_column(list, column);
    renderer = gtk_cell_renderer_toggle_new();
    column = gtk_tree_view_column_new_with_attributes("PersonInfo", renderer,
             "active", LIST_CHECKED, NULL);
    column = gtk_tree_view_append_column(list, column);
    gtk_box_pack_start(vbox, list, TRUE, TRUE, 1);

    g_signal_connect (win, "destroy", gtk_main_quit, NULL);

    gtk_widget_show_all (win);
    gtk_main ();
    return 0;
}

假设您已经有了一个容器,并且您想要向其中添加一个树视图。

为此,您查看 "Control and Display" 小部件类别,然后找到 "tree view"。如果找不到或无法识别图标,请尝试将鼠标悬停在每个图标上,直到找到它。

单击该图标,然后单击您要将其添加到的容器。这将立即导致出现一个对话框,要求您 link 使用树模型。您可以单击铅笔图标,然后单击 "New" 创建列表存储。

或者,您可以先创建列表存储或树存储。在小部件选择侧面板中,查看 "Miscellaneous"。 (在 "Composite Widgets" 和 "Deprecated" 之间。)找到列表存储或树存储,然后单击它来创建它。现在如果你创建树视图(使用上面的方法),你可以选择这个树存储/列表存储作为你的模型。

首先你必须创建一个容器来保存树视图。如果您使用网格,则可以使用例如 ScrolledWindow。在这个例子中,我只是将它直接放在 window 容器中。将 TreeView 拖到 window 容器上:

然后一个对话框要求您提供相应的树存储:

按笔和纸图标打开另一个对话框。然后按 "new".

这将使您返回到第一个对话框,新创建的 TreeStore 已经填充到该字段中。你可以直接按 "Create":

然后您可以开始为 TreeStore 创建列。我为 Name (gchararray) 创建了一个,为 Age (gint) 创建了一个:

之后您可以将数据添加到 TreeStore:

最后您仍然需要向 TreeView 添加列。这是通过单击 TreeView --> 单击编辑 --> 转到层次结构选项卡 --> 根据需要添加任意数量的列来完成的。

别忘了从 Glade 文件加载列表存储,否则当您从代码 运行 程序时,您的数据将不存在。