glade3 生成xml,在界面上添加treeview。显示是空白。
然后请问怎么编辑自己的代码,才可以在treeview中显示,行列。
添加自己的内容。
glade3 libglade Treeview 问题
- wangbo351
- 帖子: 89
- 注册时间: 2006-08-11 0:44
- 联系:
glade3 libglade Treeview 问题
Linux fans,
Research and development
Research and development
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
- wangbo351
- 帖子: 89
- 注册时间: 2006-08-11 0:44
- 联系:
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
- wangbo351
- 帖子: 89
- 注册时间: 2006-08-11 0:44
- 联系:
-
- 帖子: 8
- 注册时间: 2007-02-07 22:56
-
- 帖子: 1
- 注册时间: 2007-07-16 16:49
enum
{
COL_FIRST_NAME = 0,
COL_LAST_NAME,
COL_YEAR_BORN,
NUM_COLS
};
GtkListStore *liststore;
GtkTreeIter iter;
liststore = gtk_list_store_new(NUM_COLS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT);
/* Append an empty row to the list store. Iter will point to the new row */
gtk_list_store_append(liststore, &iter);
/* Fill fields with some data */
gtk_list_store_set (liststore, &iter,
COL_FIRST_NAME, "Joe",
COL_LAST_NAME, "Average",
COL_YEAR_BORN, (guint) 1970,
-1);
{
COL_FIRST_NAME = 0,
COL_LAST_NAME,
COL_YEAR_BORN,
NUM_COLS
};
GtkListStore *liststore;
GtkTreeIter iter;
liststore = gtk_list_store_new(NUM_COLS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT);
/* Append an empty row to the list store. Iter will point to the new row */
gtk_list_store_append(liststore, &iter);
/* Fill fields with some data */
gtk_list_store_set (liststore, &iter,
COL_FIRST_NAME, "Joe",
COL_LAST_NAME, "Average",
COL_YEAR_BORN, (guint) 1970,
-1);
代码: 全选
- wangbo351
- 帖子: 89
- 注册时间: 2006-08-11 0:44
- 联系:
多谢兄弟们了。这个我也学会了,用gtk的mvc 还不错。就是这个架构写起来比较麻烦。
m model 存储数据和数据类型
v view 显示数据可以有选择的显示,隐藏一些不显示
c control 控制显示内容 和 view 对应
遗憾的是 treeview tutorial 只有英文的。
下面是我找的教程,再次感谢楼上兄弟的分享。
GtkWidget *mytree = NULL;
GtkTreeStore *lefttree = NULL;
树型模型的建立:
void setupTreeStore()
{
? lefttree = gtk_tree_store_new(1,G_TYPE_STRING); ?
? GtkTreeIter iter ;
? GtkTreeIter child;
? gtk_tree_store_append (lefttree, &iter, NULL);//建立一个空行
? gtk_tree_store_set (lefttree, &iter ,0,"root1",-1);//为此行设置值
? gtk_tree_store_append (lefttree, &iter, NULL);//建立另一个空行
? gtk_tree_store_set (lefttree, &iter ,0,"root2",-1);//为此行设置值
? ?
? gtk_tree_store_append (lefttree, &child, &iter);//为上一行建立一个子行
? gtk_tree_store_set (lefttree, &child ,0,"child1",-1);//为此子行设置值
? ?
//更多行依此类推..........
}
?
树型视图的建立以及与数据模型的关联:
//要想让视图显示出数据,必须建立GtkCellRenderer与GtkTreeViewColumn
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
//关联视图与模型
gtk_tree_view_set_model(GTK_TREE_VIEW(mytree),GTK_TREE_MODEL(lefttree));
//将数据模型交给视图管理,视图销毁时数据会被一同销毁
g_object_unref (G_OBJECT (lefttree));
//建立一个GtkCellRenderer?
renderer = gtk_cell_renderer_text_new ();
//设置GtkCellRenderer的渲染方式
g_object_set (G_OBJECT (renderer),
? "foreground", "red",
? NULL);
//建立一个带标题的列 并且将renderer放入其中使其能显示内容
column = gtk_tree_view_column_new_with_attributes ("Family", renderer,
? "text", 0,
? NULL);
//将列设置为可以手动改变大小
?gtk_tree_view_column_set_resizable(column,TRUE);
//将列加入gtk_tree_view
gtk_tree_view_append_column (GTK_TREE_VIEW (mytree), column);
? ?
gtk_widget_show_all(mytree);
下面为建立好的树型视图实现一个功能:
? 当用户选中一个有子行的行时按Enter或Space键展开或收起子行,当选中一个没有子行的行时按Enter或Space键后台打印一些信息。
/*
TreeView的"row-activated"信号产生条件:
? --在gtk_tree_view_row_activated()被调用时
? -- 一个行被双击时
? -- 选中一个不可编辑的行,按下Space, Shift+Space, Return,Enter键时
*/
//此回调函数与 TreeView的"row-activated"信号相连接
void on_lefttree_row_activated (GtkTreeView *tree_view,
? GtkTreePath *path,
? GtkTreeViewColumn *column,
? gpointer user_data) ?
...{
? GtkTreeIter iter ;
? //根据path获得iter
? if (gtk_tree_model_get_iter(GTK_TREE_MODEL(lefttree), &iter, path))
? ...{
? //得到iter,判断iter指向的行是否有子行
? if ( gtk_tree_model_iter_has_child (GTK_TREE_MODEL(lefttree), &iter) )
? ...{
? //有子行,展开本行
? if ( gtk_tree_view_expand_row(tree_view,path,FALSE) )
? ...{
? //展开本行成功
? g_print("expand child ");
? }
? else //本行已经被展开
? ...{
? //收起本行
? gtk_tree_view_collapse_row(tree_view,path);
? g_print("collapse child ");
? }
? }
? else
? ...{
? //没有子行,直接执行规定的功能
? g_print("do some ");
? }
? }
? ?
}
获得treeview中选中的一行的GtkTreeIter或path:
GtkTreeSelection* select = gtk_tree_view_get_selection( tree_view );
gtk_tree_selection_select_path( select, path );
gtk_tree_selection_select_iter( select, &iter );
要想更改GtkTreeIter指向的数据的值,使用:
gtk_tree_store_set (lefttree, &iter,CHECKED_COLUMN ,data);
GtkTreeView本身是不带横纵滚动条的,把他放入GtkScrolledWindow中就可以了,滚动条会随内容自动调整。
m model 存储数据和数据类型
v view 显示数据可以有选择的显示,隐藏一些不显示
c control 控制显示内容 和 view 对应
遗憾的是 treeview tutorial 只有英文的。
下面是我找的教程,再次感谢楼上兄弟的分享。
GtkWidget *mytree = NULL;
GtkTreeStore *lefttree = NULL;
树型模型的建立:
void setupTreeStore()
{
? lefttree = gtk_tree_store_new(1,G_TYPE_STRING); ?
? GtkTreeIter iter ;
? GtkTreeIter child;
? gtk_tree_store_append (lefttree, &iter, NULL);//建立一个空行
? gtk_tree_store_set (lefttree, &iter ,0,"root1",-1);//为此行设置值
? gtk_tree_store_append (lefttree, &iter, NULL);//建立另一个空行
? gtk_tree_store_set (lefttree, &iter ,0,"root2",-1);//为此行设置值
? ?
? gtk_tree_store_append (lefttree, &child, &iter);//为上一行建立一个子行
? gtk_tree_store_set (lefttree, &child ,0,"child1",-1);//为此子行设置值
? ?
//更多行依此类推..........
}
?
树型视图的建立以及与数据模型的关联:
//要想让视图显示出数据,必须建立GtkCellRenderer与GtkTreeViewColumn
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
//关联视图与模型
gtk_tree_view_set_model(GTK_TREE_VIEW(mytree),GTK_TREE_MODEL(lefttree));
//将数据模型交给视图管理,视图销毁时数据会被一同销毁
g_object_unref (G_OBJECT (lefttree));
//建立一个GtkCellRenderer?
renderer = gtk_cell_renderer_text_new ();
//设置GtkCellRenderer的渲染方式
g_object_set (G_OBJECT (renderer),
? "foreground", "red",
? NULL);
//建立一个带标题的列 并且将renderer放入其中使其能显示内容
column = gtk_tree_view_column_new_with_attributes ("Family", renderer,
? "text", 0,
? NULL);
//将列设置为可以手动改变大小
?gtk_tree_view_column_set_resizable(column,TRUE);
//将列加入gtk_tree_view
gtk_tree_view_append_column (GTK_TREE_VIEW (mytree), column);
? ?
gtk_widget_show_all(mytree);
下面为建立好的树型视图实现一个功能:
? 当用户选中一个有子行的行时按Enter或Space键展开或收起子行,当选中一个没有子行的行时按Enter或Space键后台打印一些信息。
/*
TreeView的"row-activated"信号产生条件:
? --在gtk_tree_view_row_activated()被调用时
? -- 一个行被双击时
? -- 选中一个不可编辑的行,按下Space, Shift+Space, Return,Enter键时
*/
//此回调函数与 TreeView的"row-activated"信号相连接
void on_lefttree_row_activated (GtkTreeView *tree_view,
? GtkTreePath *path,
? GtkTreeViewColumn *column,
? gpointer user_data) ?
...{
? GtkTreeIter iter ;
? //根据path获得iter
? if (gtk_tree_model_get_iter(GTK_TREE_MODEL(lefttree), &iter, path))
? ...{
? //得到iter,判断iter指向的行是否有子行
? if ( gtk_tree_model_iter_has_child (GTK_TREE_MODEL(lefttree), &iter) )
? ...{
? //有子行,展开本行
? if ( gtk_tree_view_expand_row(tree_view,path,FALSE) )
? ...{
? //展开本行成功
? g_print("expand child ");
? }
? else //本行已经被展开
? ...{
? //收起本行
? gtk_tree_view_collapse_row(tree_view,path);
? g_print("collapse child ");
? }
? }
? else
? ...{
? //没有子行,直接执行规定的功能
? g_print("do some ");
? }
? }
? ?
}
获得treeview中选中的一行的GtkTreeIter或path:
GtkTreeSelection* select = gtk_tree_view_get_selection( tree_view );
gtk_tree_selection_select_path( select, path );
gtk_tree_selection_select_iter( select, &iter );
要想更改GtkTreeIter指向的数据的值,使用:
gtk_tree_store_set (lefttree, &iter,CHECKED_COLUMN ,data);
GtkTreeView本身是不带横纵滚动条的,把他放入GtkScrolledWindow中就可以了,滚动条会随内容自动调整。
Linux fans,
Research and development
Research and development
-
- 帖子: 2
- 注册时间: 2008-06-02 11:44