在具有多行的 GtkTreeView 中,如何以编程方式更新特定行上的 GtkCellRendererCombo 模型

In a GtkTreeView with multiple rows, how can I programmatically update the model of a GtkCellRendererCombo on a specific line?

本文关键字:更新 方式 编程 模型 GtkCellRendererCombo GtkTreeView      更新时间:2023-10-16

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

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

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

我尝试用g_object_set更新模型,但这更新了列中的所有CellRendererCombo

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

在 Glade

  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);
    }
    

谢谢你们的帮助! :)