我使用glade3在Windows上开发一个简单的应用程序。官方参考手册似乎已过时,因此我使用gtk-function创建Listview并将MySQL-Query结果放在字段行下。需要有关通过glade3创建listview而不是代码的帮助。
再次感谢! 我的代码:
#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;
}
答案 0 :(得分:2)
首先,您必须创建一个容器来保存树视图。如果您使用网格,则可以使用ScrolledWindow。在这个例子中,我只是将它直接放在窗口容器中。在窗口容器上拖动TreeView:
然后会出现一个对话框,要求您提供相应的树库:
按笔和纸图标打开另一个对话框。然后按“新”。
这将使您返回到第一个对话框,新创建的TreeStore已填入该字段。您只需按“创建”:
然后您可以开始为TreeStore创建列。我创建了名字(gchararray)和一个年龄(gint):
之后,您可以将数据添加到TreeStore:
最后,您仍然需要向TreeView添加列。这是通过单击TreeView - &gt;完成的。点击编辑 - &gt;转到“层次结构”选项卡 - &gt;根据需要添加任意数量的列。
当您从代码运行程序时,不要忘记从Glade文件加载liststore,否则您的数据将不存在。
答案 1 :(得分:1)
假设您已经有了一个容器,并且想要在其中添加树视图。
要做到这一点,你要看一下&#34;控制和显示&#34;小部件的类别,并找到&#34;树视图&#34;。如果您无法找到它,或者无法识别图标,请尝试将每个图标悬停,直到找到它为止。
单击图标,然后单击要将其添加到的容器。这将立即导致出现一个对话框,要求您将其与树模型链接。您可以单击铅笔图标,然后单击&#34;新建&#34;创建一个列表商店。
或者,您可以先创建列表存储或树存储。在小部件选择侧面板中,查看&#34;其他&#34;。 (在&#34;复合窗口小部件&#34;和&#34;已弃用&#34;。)找到列表存储或树存储,然后单击它以创建它。现在,如果您创建树视图(使用上面的方法),您可以选择此树存储/列表存储作为您的模型。