GTK之treeview的学习
其实接触gtk也没多久,只是把学到的做一总结,也算是备忘吧,以后真要忘了的话【几乎是铁定的了】,翻着看看,还能想起来。
感觉treeview控件对于gtk的入门来说应该算比较高级的构件了,而且学习它的同时也可以学习下gtk+是如何实现MVC架构的。
说起MVC,现在应该还算比较流行的了。其实也就是model-view-controller,就其本身而言,其实好像也没多大新意。Gtk+对其的实现不是很标准,但应该说有些东西还是套用的,因为本身差别并不大。
以treeview的使用为例,
首先我们定义model
{
GtkListStore *store;
store = gtk_list_store_new(3,G_TYPE_STRING, G_TYPE_STRING,G_TYPE_STRING);
return GTK_TREE_MODEL(store);
}
当然这里面先不加载具体的数据。Gtk中用于treeview的model一般可以用liststore或treestore来实现。
然后,将view与model关联起来
gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
}
看起来比较复杂,其实还是比较简单的
首先view要通过column来展现,而column中的内容,则有store来提供,当然store并不管里面具体是什么东西,所以,就需要cellrenderer来描述。而具体的数据可能又有很多行(row),每一行怎么区别呢,就要用到iter。
当然上面的实现还是复杂了些,因为每个列有两个cellrenderer(一个用来描述图标,另一个用来描述文字),如果每一个列(column)只有一种属性,或是文本,或是图片,那就可以用更方便的使用如下函数。
column = gtk_tree_view_column_new_with_attributes("column 1",renderer_icon, "stock-id", 0, NULL);
gtk_list_view_append_column(GTK_TREE_VIEW(list), column);
这样就简单多了。
至此我们就建立了model和view,当然具体的数据还没有添加。
在添加具体数据之前,先看看在main函数中应如何调用
list= gtk_tree_view_new_with_model(list_model_create());
list_view_ini(list);
下面要往里面填数据了,
}
我们定义了一个插入用的函数,传入的后三个参数icon,str,col分别表示图标,文自信息和文字信息对应的颜色,图标对应的cellrenderer是pixbuf型的,而文字信息及其颜色是一个text型cellrenderer的两个属性,前面通过pack打包到一个column里面了。
在main函数中,只需简单的插入数据就行了,例如
list_append(list,GTK_STOCK_CLOSE,"world","grey");
treeview已经构建完成了,但这似乎没有什么用啊,要真正有用还需要知道如何获取选择信息,
当然首先要做一信号的链接
model=gtk_tree_view_get_model(GTK_TREE_VIEW(list));
g_signal_connect(selection, "changed", G_CALLBACK(on_changed), model);
这里将model传入是为了实现一个简单的图标变化。当然还需额外说明的是菜单的选择还需要使用到一个名为selection的构件,它是专门用来描述treeview的选择项的GtkTreeSelection *selection;
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
选择项若有所改变其相应的回调函式如下,
}
}
这里面的方法还是比较麻烦的逐一判断的那种,这主要是为了能够实现对图标的选择性修改,当然一般来说如果只需要获取选择信息可以用一种很简单的方式。
g_free(value);
}
}
这里要注意获取的value实则指向了一块新分配在自由存储区的内存,用完要及时释放掉。
至此,就完成了的一个简单的treeview小程序。
下面贴出完整的代码,