我正在编写一个使用C / C ++和Glade 3作为GUI的应用程序。
GUI的一部分,包括多行TreeView
,其中每行代表一个用户。
第二列是代表产品品牌的CellRendererCombo
,第三列是代表产品的另一个CellRendererCombo
。
我要做的是:每当我为用户设置产品品牌(第2列)时,我希望产品CellRendererCombo
的选项(在第3列中)仅显示该产品的产品品牌。
我尝试使用g_object_set
更新模型,但会更新列中的所有CellRendererCombo
。
答案 0 :(得分:0)
正如您发现使用g_object_set
设置组合框的模型设置整个列的模型。您需要做的是在树视图中使用的模型中有一列(COLUMN_COMBOBOX_MODEL),该列存储对要在每个行的组合框中使用的模型的引用,并执行类似gtk_tree_view_column_add_attribute (column, combobox_renderer, "model", COLUMN_COMBOBOX_MODEL)
的映射cellrenderer的model
属性为每行的正确模型。您仍然可以使用g_object_set来设置单元格渲染器的"text-column"
和"editable"
属性。
答案 1 :(得分:0)
在格莱德:
GtkTreeModel
类型的新列添加到TreeView
的模型中。遗憾的是,GtkTreeModel
不是Glade在创建列时提供的下拉列表的一部分,因此我手动将GtkTreemodel
键入类型列。CellRendererCombo
,并将我刚刚创建的列定义为模型。在源代码中:
当我将数据加载到TreeView
的模型时,我为每一行创建一个新的ListStore
并在TreeView
模型中存储对它的引用。< / p>
gtk_list_store_set (GTK_LIST_STORE(data->liststore_analysis), &iter, COLUMN_MODEL, GTK_LIST_STORE(data->liststore_products), -1);
当我更改代表品牌的CellRendererCombo
的值时,我会更新模型中其他CellRendererCombo
的行。
GtkListStore * list = GTK_LIST_STORE(data->liststore_products);
GtkTreeIter iter;
const char * openmoko[] = {"Neo 1973","Neo FreeRunner","Dash Express","3D7K","WikiReader"};
int i, openmokoModels = sizeof (openmoko) / sizeof (*openmoko);
for (i = 0; i < openmokoModels; i++){
gtk_list_store_append(list, &iter);
gtk_list_store_set(list, &iter, 0, openmoko[i], -1);
}
谢谢你们的帮助! :)