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

时间:2013-10-11 17:16:12

标签: c++ c gtk gtk3 glade

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

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

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

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

2 个答案:

答案 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)

在格莱德:

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

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

      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);
      }
      
    3. 谢谢你们的帮助! :)