2011年(19)
分类: 嵌入式
2011-12-16 21:50:39
外部特征:一个 TreeView 有多个 Column,而每个 Column 中可以有多个 CellRenderer,同时一个 CellRenderer 自身拥有多个属性。
TreeView 的内部数据由 TreeModel 决定,同时也由 TreeModel 存储,用 gtk_list_store_set () 设置一行的数据时,函数传递的值的类型与个数必须与 TreeModel 对应
一般来说,当我们在程序中用 gtk_list_store_append () 添加一行,gtk_list_store_set () 设置该行的数据时,除了在 TreeModel 内部存储了数据外,还可以改变 TreeView 中该行的外部特征。
然而,我们可以看到的 TreeView
的外部特征:文字、图像、复选框的改变,是由于 CellRenderer 的属性改变而导致的,而不是由于 TreeModel
添加了数据而导致的。
这不是很奇怪吗?上面说 gtk_list_store_set () 可以改变
TreeView 的外部特征,现在说 TreeView 外部特征的改变不是由 gtk_list_store_set ()
引起的。
其实,gtk_list_store_set () 能改变 TreeView 一行的外部显示是因为相应的数据在函数内部实现类型转换,然后传递到 CellRenderer 的属性中,而CllRenderer 属性的改变导致了一行显示的改变。
而 TreeModel 的哪个数据与 CellRenderer 的哪个属性联系起来是由gtk_tree_view_column_set_attributes () 决定的。这个函数把 TreeModel 的某个数据与 CellRenderer 的某个属性联系起来。当调用 gtk_list_store_set () 时,该函数在内部先把传到 TreeModel 的数据的类型转换为与 CellRenderer 属性要求的类型,然后把值赋予 CellRenderer 的属性。CellRenderer 属性的改变就导致的 TreeView 外部特征的改变了。
下面的例子是用C实现的GtkTreeView,代码如下所示:
#include enum{ GtkTreeModel* createModel(){ return GTK_TREE_MODEL(store); } gboolean selection_changed(GtkTreeSelection *selection, GtkLabel
*label){ treeView =
gtk_tree_selection_get_tree_view(selection); gtk_label_set_text(label,active); }
gtk_init(&argc, &argv);
gtk_window_set_default_size(GTK_WINDOW(window),200,50);
selection =
gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView)); g_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL); gtk_widget_show_all(window); gtk_main(); |
程序执行结果如下图