Я пишу приложение, которое использует C / C ++ и Glade 3 для 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
свойство cellrenderer для правильной модели для каждой строки. Вы все еще можете использовать g_object_set для установки "text-column"
а также "editable"
свойства рендера клеток.
На поляне:
GtkTreeModel
к модели моего TreeView
, к несчастью GtkTreeModel
не является частью раскрывающегося списка, который Glade предоставляет при создании столбца, поэтому я набрал вручную GtkTreemodel
к столбцу типа.CellRendererCombo
который представляет продукты и определил в качестве модели столбец, который я только что создал.В исходном коде:
Когда я загружаю данные в модель TreeView
Создаю для каждого ряда новый ListStore
и сохранить ссылку на него в TreeView
модель.
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);
}
Спасибо, ребята, за вашу помощь! 🙂