本来打算写一下布局问题的,但是布局比较简单,自己多实验几次就差不多了。改写TreeView的学习心得了。
在Gtk中,Treeview和Listview(暂时只发现其列表的功能,可能Listview另有其控件,这里暂时使用Listview的名字)使用 的是同一个函数gtk_tree_view_new即可;但是他跟按钮菜单等控件的区别很大,因为他还要包括节点(tree)或行(list)。下面分别 来说明一下,
1.先从简单的入手吧ListView
创建一个Listview非常简单
GtkWidget *list = gtk_tree_view_new();
对于Grid类型的Listview来说,一般都有表头,如下代码
enum {col_name = 0, n_cols}; // 定义枚举类型,不明白的话参考C语言
// 这里的枚举之定义了一列,当然你可以自己多定义几列
// 其中col_name为列,n_clos为列数,这里自动为1
// 定义enum {col_name = 0, col_age, n_cols}; 这就是定义2列,以此类推
1 GtkCellRenderer* renderer; // 定义一个Render
2 renderer = gtk_cell_renderer_text_new(); // 创建一个Render
/* 把这一列加到Listview中 */
3 gtk_tree_view_insert_column_with_attributes(
GTK_TREE_VIEW(list), //
-1,
"name", // 显示的内容
renderer, // 上面创建的Render
"text", // 显示的格式
col_name, // 列号
NULL);
这就完成了一列的添加,当然,添加多列重复2.3步即可,注意:参数变化,我想大家都能看出来吧?
该添加数据了,这也是GtkTreeview比较难理解的地方,也比较繁琐;
首先,我们必须了解的是一个GtkTreeview要有一个GtkTreeModel来存储其数据,并且GtkTreeview能够显示 GtkTreeModel中存储的数据,这样我们只要改变GtkTreeModel中的数据GtkTreeview显示的内容也会发生变化,这样理解起来 应该不难吧?现在我们来实践一下吧。
对于GtkTreeview它本身并没有GtkTreeModel,所以我们要创建GtkTreeModel,下面是我们自己写的一个函数:
/* 创建model */
GtkTreeModel *createModel()
{
GtkListStore *store;
/* 创建model,注意这个函数的参数,第一个为列数,后面一次是列存储数据的类型,我们这里是一列,如果是多列在后面依次增加就行,如:
gtk_list_store_new(n_cols, G_TYPE_STRING, G_TYPE_STRING);
*/
store = gtk_list_store_new(n_cols, G_TYPE_STRING);
return GTK_TREE_MODEL(store);
}
我们这么调用此函数:
GtkTreeModel *store = createModel();
然后调用gtk_tree_view_set_model函数来绑定model和tree,这是必须的,如下所示:
gtk_tree_view_set_model(GTK_TREE_VIEW(tree), store);
下面的工作就是往model中添加数据了,
GtkTreeIter iter; // 定义元素,GtkTreeIter是一个结构,我理解它是一行
gtk_list_store_append(GTK_TREE_STORE(store), &iter);
// 把这一行添加到model中,listview也就会显示出来了
/* 为这一行添加数据 */
gtk_list_store_set(GTK_TREE_STORE(store),
&iter,
col_name, // 行号
在Gtk中,Treeview和Listview(暂时只发现其列表的功能,可能Listview另有其控件,这里暂时使用Listview的名字)使用 的是同一个函数gtk_tree_view_new即可;但是他跟按钮菜单等控件的区别很大,因为他还要包括节点(tree)或行(list)。下面分别 来说明一下,
1.先从简单的入手吧ListView
创建一个Listview非常简单
GtkWidget *list = gtk_tree_view_new();
对于Grid类型的Listview来说,一般都有表头,如下代码
enum {col_name = 0, n_cols}; // 定义枚举类型,不明白的话参考C语言
// 这里的枚举之定义了一列,当然你可以自己多定义几列
// 其中col_name为列,n_clos为列数,这里自动为1
// 定义enum {col_name = 0, col_age, n_cols}; 这就是定义2列,以此类推
1 GtkCellRenderer* renderer; // 定义一个Render
2 renderer = gtk_cell_renderer_text_new(); // 创建一个Render
/* 把这一列加到Listview中 */
3 gtk_tree_view_insert_column_with_attributes(
GTK_TREE_VIEW(list), //
-1,
"name", // 显示的内容
renderer, // 上面创建的Render
"text", // 显示的格式
col_name, // 列号
NULL);
这就完成了一列的添加,当然,添加多列重复2.3步即可,注意:参数变化,我想大家都能看出来吧?
该添加数据了,这也是GtkTreeview比较难理解的地方,也比较繁琐;
首先,我们必须了解的是一个GtkTreeview要有一个GtkTreeModel来存储其数据,并且GtkTreeview能够显示 GtkTreeModel中存储的数据,这样我们只要改变GtkTreeModel中的数据GtkTreeview显示的内容也会发生变化,这样理解起来 应该不难吧?现在我们来实践一下吧。
对于GtkTreeview它本身并没有GtkTreeModel,所以我们要创建GtkTreeModel,下面是我们自己写的一个函数:
/* 创建model */
GtkTreeModel *createModel()
{
GtkListStore *store;
/* 创建model,注意这个函数的参数,第一个为列数,后面一次是列存储数据的类型,我们这里是一列,如果是多列在后面依次增加就行,如:
gtk_list_store_new(n_cols, G_TYPE_STRING, G_TYPE_STRING);
*/
store = gtk_list_store_new(n_cols, G_TYPE_STRING);
return GTK_TREE_MODEL(store);
}
我们这么调用此函数:
GtkTreeModel *store = createModel();
然后调用gtk_tree_view_set_model函数来绑定model和tree,这是必须的,如下所示:
gtk_tree_view_set_model(GTK_TREE_VIEW(tree), store);
下面的工作就是往model中添加数据了,
GtkTreeIter iter; // 定义元素,GtkTreeIter是一个结构,我理解它是一行
gtk_list_store_append(GTK_TREE_STORE(store), &iter);
// 把这一行添加到model中,listview也就会显示出来了
/* 为这一行添加数据 */
gtk_list_store_set(GTK_TREE_STORE(store),
&iter,
col_name, // 行号