GtkTreeView是GTK中的一个高级控件,可以用于显示表格类的数据,或者树形数据(比如目录列表)。话说在GTK里GtkTreeView真的是麻烦得吓死人(好吧,我承认这只是我的看法)。根据GTK手册,GtkTreeView采用的是所谓“MVC”(模型/视图/控制器)模式的概念,虽然我到现在都没理解清楚MVC中C代表的时是啥。我只是按照我对GTK手册的理解,作如下描述吧!

大家都知道,表格有行、列、标题、单元格的概念。我们把他们对应到GTK的控件上来看看把:

[caption id="attachment_611” align="alignnone” width="238” caption="GtkTreeView缩略图”][/caption]

  • 上面的“文件”、“编辑”、“视图”不用误会啦,那个是菜单栏。

  • 接着那个灰灰的“歌手”、“库存数量”、“高保真”那个,中间用竖线分隔开的哪一栏,就是标题栏啦。

  • 然后下面白白的那几行数据自然就是行了;

  • “歌手”竖着下来的那一列自然就是列了;

  • 而每一个数据对应的就是一个单元格,比如“周杰伦”、“230”都是单元格。

再看看在GTK里面是怎么处理这些概念的吧。

  • 首先,有个叫做“GtkTreeView”的东西(控件)用来表示这里的整个表格(“视图”)。注意,他只是表示表格视图,并不包含里面的任何数据。就好比HTML中的标签一样。

  • 然后,有个叫做GtkTreeStore或者GtkListStore的东西(对象),用来表示表格里所有数据的集合。注意,他只是个表示数据集合的对象,不代表任何表现形式(比如表格)。就好比我们用逗号和换行分隔的csv文件、数据库里的SQL数据一样。

  • 接着有个叫GtkTreeIter的东西(对象),用于表示数据集合中的一行数据的集合。简单的说就是一行数据。同样注意,这里只是数据,不包含表现形式。所以和表格的行不一样。

  • 有个叫做GtkTreeViewColumn的东西,自然就是表示表格中的列了。就好比HTML中的的标签。

  • 继续,有个叫做GtkTreeViewRender的东西,用于表示具体的某个单元格,注意他表示具体的数据单元格,你可以通过设置他的属性,来控制这个单元格显示的数据。

当然,还有更多的对应表格中的概念的控件、对象,以及他们的派生对象。但是只要有上面的几种,基本就可以让我们的“表格”运行起来了,所以就此打住。我们接下来看看怎么把我们的数据“搬”上GTK去。

首先,自然是先定义一个数组,包含我们所需要的数据。当然,这里也定义一个结构方便后面引用

然后,我们定义一个枚举类型,用来表示各个列(的序号)。当然你完全可以直接用数字1、2、3……来表示,这里这样做只是为了提高程序的可读性。注意这里用了一个技巧,枚举类型最后一个COLUMN_NUM。虽然看上去是枚举类型的一个元素,其实这里只是利用枚举类型的原理(各枚举元素依次代表从0开始的数字),COLUMN_NUM对应的整数值刚好就是除了这个元素外的所有元素个数,即列的个数。

准备工作完了,我们看看怎么样把表格数据“放”上GTK去吧!

首先,我们把数据处理好。先定义一个表格的数据集store,然后将前面我们的所有的数据都添加上去:

代码很容易懂,先创建一个GtkTreeStore和GtkTreeIter对象分别表示数据集、数据集中的一样。然后调用gtk_tree_store_append()向数据集store添加一个新行iter,然后调用gtk_tree_store_set()设置这个新行的各个字段的值。然后循环这个过程直到所有数据添加完成。调用的函数详情参考GTK手册。

然后我们来处理“表现”,也就是界面。

代码也不难懂,先用gtk_tree_view_new()创建一个treeview控件view,用来表示整个表格。

然后创建一个renderer对象表示单元格。这里需要注意的是,上面两次分别用gtk_cell_renderer_text_new()和gtk_cell_renderer_toggle_new()创建renderer对象。这两个函数创建的都是rendder对象的子对象,分别用字符框、复(单)选按钮来显示对应列的数据。并且附加到view上面去。

最后……