GTK TreeView原理与使用方法解析
什么是GTK TreeView?
GTK TreeView是GTK+库中非常重要的一个控件,它是一种树形结构的控件,通常用于显示具有层次结构的数据。例如,在文件管理器中,我们可以将文件夹按照树状形式列表显示,其中每一个文件夹都可以展开或者折叠,里面的文件也可以在不同的目录下进行移动或者复制。GTK TreeView 就是可以实现这种功能的控件。
TreeView的基本结构
TreeView是由TreeView和ListStore两个部分组成的。TreeView是用来显示数据的部分,而ListStore是TreeView中的数据存放的部分。
在TreeView中,一般至少有两个列:父节点和子节点。因此,在TreeView中,我们需要将每条数据映射成一行,每个属性映射成一列。
TreeView的使用方法
步骤1:导入库
使用GTK TreeView需要使用GTK+库,在程序中导入如下头文件:
#include <gtk/gtk.h>
步骤2:创建TreeView
首先,我们需要创建TreeView。代码如下:
GtkTreeView *treeview;
treeview = GTK_TREE_VIEW(gtk_tree_view_new());
在这里,我们使用gtk_tree_view_new函数来创建TreeView,并将其转化成GtkTreeView类型。
步骤3:创建TreeViewColumn
接下来,我们需要创建TreeViewColumn来作为TreeView的列,每一列可以对应一项数据的一个属性。代码如下:
GtkTreeViewColumn *column;
column = gtk_tree_view_column_new();
gtk_tree_view_column_set_title(column,"Title");
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
在这里,我们使用gtk_tree_view_column_new函数来创建column,使用gtk_tree_view_column_set_title函数可以设置column的标题,使用gtk_tree_view_append_column函数将列添加到TreeView中。
步骤4:创建CellRenderer
每一个CellRenderer代表了一个属性,例如在文件管理器中,我们会用到多种属性,如名称、大小、日期、类型等等。我们需要为每一列创建一个CellRenderer来显示对应属性的数据。代码如下:
GtkCellRenderer *renderer;
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start (column, renderer, TRUE);
gtk_tree_view_column_add_attribute(column, renderer,"text",0);
在这里,我们使用gtk_cell_renderer_text_new函数来创建renderer,使用gtk_tree_view_column_pack_start函数将renderer添加到column中,使用gtk_tree_view_column_add_attribute函数将每一列与属性关联起来。
步骤5:创建ListStore
最后,我们需要创建ListStore来存放数据。代码如下:
GtkListStore *store;
store = gtk_list_store_new(1, G_TYPE_STRING);
在这里,我们使用gtk_list_store_new函数来创建store,并使用G_TYPE_STRING宏指定store中的数据为字符串类型。
步骤6:将数据添加到ListStore中
当我们创建好了ListStore之后,我们需要将数据添加到ListStore中。代码如下:
GtkTreeIter iter;
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, 0, "Hello World", -1);
在这里,我们使用gtk_list_store_append函数来向store中添加一行数据,使用gtk_list_store_set函数来设置该行数据的值。
步骤7:将ListStore与TreeView关联
最后,我们需要将ListStore与TreeView关联起来。代码如下:
gtk_tree_view_set_model(treeview, GTK_TREE_MODEL(store));
在这里,我们使用gtk_tree_view_set_model函数将TreeView与ListStore关联。
示例1:创建一棵简单的树
下面,我们通过一个示例来演示如何创建一棵简单的树。代码如下:
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
gtk_init(&argc, &argv);
GtkWidget *window;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GtkTreeView *treeview;
treeview = GTK_TREE_VIEW(gtk_tree_view_new());
gtk_container_add(GTK_CONTAINER (window), GTK_WIDGET (treeview));
GtkTreeViewColumn *column;
column = gtk_tree_view_column_new();
gtk_tree_view_column_set_title(column, "Family");
gtk_tree_view_append_column(GTK_TREE_VIEW (treeview), column);
GtkCellRenderer *renderer;
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start(column, renderer, TRUE);
gtk_tree_view_column_add_attribute(column, renderer, "text", 0);
GtkListStore *store;
store = gtk_list_store_new(1, G_TYPE_STRING);
GtkTreeIter iter1, iter2;
gtk_list_store_append(store, &iter1);
gtk_list_store_set(store, &iter1, 0, "Family", -1);
gtk_list_store_append(store, &iter2);
gtk_list_store_set(store, &iter2, 0, "Father", -1);
gtk_tree_store_set(store, &iter2, 0, "Son", -1);
gtk_tree_store_set(store, &iter2, 0, "Daughter", -1);
gtk_tree_view_set_model(GTK_TREE_VIEW (treeview), GTK_TREE_MODEL(store));
gtk_widget_show_all(window);
gtk_main();
return 0;
}
在这个示例中,我们创建了一棵简单的树,该树仅有一层数据。
示例2:创建一棵多层级的树
下面,我们通过示例来演示如何创建一棵多层级的树。我们将创建一个表示员工层级的树,每个部门有一个经理,每个经理下面有若干个员工。代码如下:
#include <gtk/gtk.h>
int main (int argc, char *argv[])
{
gtk_init (&argc,&argv);
GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "Employee Hierarchy");
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
GtkTreeView *treeview = GTK_TREE_VIEW (gtk_tree_view_new ());
gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (treeview));
gint treecolumn = 0;
GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes ("Employee", renderer,
"text", treecolumn,NULL);
gtk_tree_view_column_set_expand (column, TRUE);
gtk_tree_view_column_set_resizable (column, TRUE);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
GtkListStore *store = gtk_list_store_new (1, G_TYPE_STRING);
GtkTreeIter iter;
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter, 0, "Management",-1);
gtk_tree_store_set (GTK_TREE_STORE (store), &iter, 0, "Director", -1);
GtkTreeIter iter_child;
gtk_list_store_append (store, &iter_child);
gtk_list_store_set (store, &iter_child, 0, "Accounts Department", -1);
gtk_tree_store_set (GTK_TREE_STORE (store), &iter_child, 0, "Chief Accountant",-1);
GtkTreeIter iter_grandchild;
gtk_list_store_append (store, &iter_grandchild);
gtk_list_store_set (store, &iter_grandchild, 0, "Buchhaltung 1", -1);
gtk_tree_store_set (GTK_TREE_STORE (store), &iter_grandchild, 0, "Consultant", -1);
gtk_list_store_append (store, &iter_grandchild);
gtk_list_store_set (store, &iter_grandchild, 0, "Buchhaltung 2", -1);
gtk_tree_store_set (GTK_TREE_STORE (store), &iter_grandchild, 0, "Consultant", -1);
GtkTreeIter iter_child1;
gtk_list_store_append (store, &iter_child1);
gtk_list_store_set (store, &iter_child1, 0, "Sales Department",-1);
gtk_tree_store_set (GTK_TREE_STORE (store), &iter_child1, 0, "Sales Manager", -1);
GtkTreeIter iter_grandchild11;
gtk_list_store_append (store, &iter_grandchild11);
gtk_list_store_set (store, &iter_grandchild11, 0, "Salesman 1", -1);
gtk_tree_store_set (GTK_TREE_STORE (store), &iter_grandchild11, 0, "Salesman", -1);
GtkTreeIter iter_grandchild12;
gtk_list_store_append (store, &iter_grandchild12);
gtk_list_store_set (store, &iter_grandchild12, 0, "Salesman 2", -1);
gtk_tree_store_set (GTK_TREE_STORE (store), &iter_grandchild12, 0, "Salesman", -1);
gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (store));
gtk_widget_show_all (window);
gtk_main ();
return 0;
}
在这个示例中,我们创建了一个员工层级的树,每个经理下面还可以有子经理(多层级的树),同时每个部门和经理都有自己的名称。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:GTK treeview原理及使用方法解析 - Python技术站