1

我正在编写一个使用 C/C++ 和 Glade 3 作为 GUI 的应用程序。

GUI 的一部分包括多行TreeView,其中每一行代表一个用户。在第二列有一个CellRendererCombo代表产品品牌,在第三列有另一个CellRendererCombo代表产品。

我要做的是:每当我为用户设置产品品牌(在第 2 列中)时,我希望产品的选项CellRendererCombo(在第 3 列中)仅显示该品牌的产品。

我尝试使用更新模型,g_object_set但更新CellRendererCombo列中的所有内容。

4

2 回答 2

0

在格莱德:

  1. 我需要做的是在GtkTreeModel我的模型中添加一个新的类型列TreeView。不幸GtkTreeModel的是,它不是 Glade 在您创建列时提供的下拉列表的一部分,因此我手动键入GtkTreemodel类型列。
  2. 然后,我编辑了CellRendererCombo代表产品的 ,并将我刚刚创建的列定义为模型。

在源代码中:

  1. 当我将数据加载到 的模型时TreeView,我为每一行创建一个新ListStore的并将对它的引用存储在TreeView模型中。

    gtk_list_store_set (GTK_LIST_STORE(data->liststore_analysis), &iter, COLUMN_MODEL, GTK_LIST_STORE(data->liststore_products), -1);
    
  2. 当我更改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);
    }
    

谢谢你们的帮助!:)

于 2013-10-16T13:49:09.923 回答
0

正如您发现使用g_object_set设置组合框的模型设置整个列的模型。您需要做的是在您用于树视图的模型中有一列 (COLUMN_COMBOBOX_MODEL),该列存储对您要在组合框中为每一行使用的模型的引用,并执行类似gtk_tree_view_column_add_attribute (column, combobox_renderer, "model", COLUMN_COMBOBOX_MODEL)映射modelcellrenderer 的属性的操作到每一行的正确模型。您仍然可以使用 g_object_set 设置单元格渲染器的"text-column""editable"属性。

于 2013-10-12T09:31:23.767 回答