glade3 libglade Treeview 问题

软件和网站开发以及相关技术探讨
回复
头像
wangbo351
帖子: 89
注册时间: 2006-08-11 0:44
联系:

glade3 libglade Treeview 问题

#1

帖子 wangbo351 » 2008-07-11 15:16

glade3 生成xml,在界面上添加treeview。显示是空白。
然后请问怎么编辑自己的代码,才可以在treeview中显示,行列。
添加自己的内容。 :shock:
Linux fans,
Research and development
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#2

帖子 eexpress » 2008-07-11 15:45

安装devhelp。然后,在glade里面可以f1吧。
或者直接进devhelp搜索。
● 鸣学
头像
wangbo351
帖子: 89
注册时间: 2006-08-11 0:44
联系:

#3

帖子 wangbo351 » 2008-07-11 16:11

大侠,误会我的意思了。我会使用treeview。也可以插入数据。
问题在于 ,如何在main中 调用 xml文件中定义过的treeview组建。
然后在给treeview赋值。
就是说在xml里现定义国了treeview,然后怎么初始华treeview.
Linux fans,
Research and development
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#4

帖子 eexpress » 2008-07-11 16:27

还是一样啊。你不管用不用xml载入控件,数据初始化,还是那些控件的相关函数。devhelp里面吧控件相关的函数,都集中了。用就是。
● 鸣学
头像
wangbo351
帖子: 89
注册时间: 2006-08-11 0:44
联系:

#5

帖子 wangbo351 » 2008-07-11 17:09

郁闷阿 。不知道能不能找个例子。
gkt 文档不全。初次遇到这种情况。develhelp 也有,就是不会用。
函数查了不少,不知道用那个。
有个例子吗?
Linux fans,
Research and development
AzureSky
帖子: 8
注册时间: 2007-02-07 22:56

#6

帖子 AzureSky » 2008-07-13 17:50

treeview可以说是一个前台,负责数据的显示
你需要创建一个model,这个model用来处理数据之类
model在glade上是做不了,要在代码里面自己实现
然后在treeview添加model中需要显示的数据(可以全部,也可以显示部分);

比如在model中,每一列都有属性 (序号,名称,用户名,密码等等),
然后你在treeview中设置一列中显示哪里属性,比如(序号,用户);


GtkTreeModel

GtkTreeModel — The tree interface used by GtkTreeView
since0325
帖子: 1
注册时间: 2007-07-16 16:49

#7

帖子 since0325 » 2008-07-16 11: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);

代码: 全选

头像
wangbo351
帖子: 89
注册时间: 2006-08-11 0:44
联系:

#8

帖子 wangbo351 » 2008-08-08 9:18

多谢兄弟们了。这个我也学会了,用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中就可以了,滚动条会随内容自动调整。
Linux fans,
Research and development
stbrine
帖子: 2
注册时间: 2008-06-02 11:44

Re: glade3 libglade Treeview 问题

#9

帖子 stbrine » 2008-10-24 10:50

学习...
回复