В GtkTreeView с несколькими строками, как я могу программно обновить модель GtkCellRendererCombo на определенной строке?

Я пишу приложение, которое использует C / C ++ и Glade 3 для GUI.

Часть графического интерфейса, включает в себя несколько строк TreeView где каждая строка представляет пользователя.
На втором столбце есть CellRendererCombo который представляет товарные бренды и в третьей колонке есть еще CellRendererCombo это представляет продукты.

Я пытаюсь сделать следующее: всякий раз, когда я устанавливаю марку продукта (в столбце 2) для пользователя, я хочу выбрать варианты продуктов. CellRendererCombo (в столбце 3), чтобы показать только продукты этой марки.

Я пытался обновить модель с g_object_set но это обновляет все CellRendererCombo в колонке.

1

Решение

Как вы обнаружили, используя g_object_set чтобы установить модель для выпадающего списка, задайте модель для всего столбца. Что вам нужно сделать, это иметь столбец (COLUMN_COMBOBOX_MODEL) в модели, которую вы используете для древовидной структуры, которая хранит ссылку на модель, которую вы хотите использовать в выпадающем списке для каждой строки, и делать что-то вроде gtk_tree_view_column_add_attribute (column, combobox_renderer, "model", COLUMN_COMBOBOX_MODEL) нанести на карту model свойство cellrenderer для правильной модели для каждой строки. Вы все еще можете использовать g_object_set для установки "text-column" а также "editable" свойства рендера клеток.

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

Спасибо, ребята, за вашу помощь! 🙂

0

По вопросам рекламы [email protected]