如何通过 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 文件加载列表存储,否则当您从代码 运行 程序时,您的数据将不存在。
我正在使用 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 文件加载列表存储,否则当您从代码 运行 程序时,您的数据将不存在。