Gtk.Combobox отображает два столбца (вместо 1). Почему?

Я понимаю, что ГТК-2 теперь «античный». У меня есть старая программа, которую я должен изменить, и она слишком велика, чтобы преобразовать ее в GTK-3 за то время, которое у меня есть. Вот в чем проблема:

  • Я добавил ComboBox, которому я назначаю ListBox с двумя столбцами (G_TYPE_INT и G_TYPE_STRING).
  • По какой-то причине в поле со списком отображаются оба столбца, хотя я думаю, что код, показанный ниже, назначает только один.
    void
    fill_list(GtkComboBox *cbbox)
    {
      GtkListStore *store = gtk_list_store_new(2, G_TYPE_INT, G_TYPE_STRING);
      GtkTreeIter iter;
      GtkCellRenderer *renderer = gtk_cell_renderer_text_new();


      gtk_combo_box_set_model(cbbox, GTK_TREE_MODEL(store));
      gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(cbbox), renderer, TRUE);
      gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(cbbox), renderer,
                                   "text", 0, NULL);
      gtk_combo_box_set_entry_text_column(cbbox, 0);
      gtk_list_store_append(store, &iter);
      //                               Col 0  Col 1
      gtk_list_store_set(store, &iter, 0, 0,  1, "Kind 1", -1);
      gtk_list_store_append(store, &iter);
      gtk_list_store_set(store, &iter, 0, 1,  1, "Kind 2", -1);
      gtk_list_store_append(store, &iter);

Это часть функции, вызываемой сигналом «реализовать» виджета. Замена ... text, 0... на ... text, 1... изменяет второй столбец ComboBox, как и ожидалось, на второй столбец ListStore.

Захват (открытого) поля со списком, показывая 2 поля

Но по неизвестной причине я не могу избавиться от первого столбца. Я просмотрел весь проект на наличие признаков кода, которые могут повлиять - не повезло. Интерфейс был сгенерирован с помощью Glade-2.

В последние годы я больше работал с Python, поэтому подозреваю, что мне здесь чего-то не хватает. Я даже в основном тестировал этот код на Python, и у меня не было проблем.

Буду признателен за предложения!


person jcoppens    schedule 27.01.2021    source источник


Ответы (1)


Проблема была решена!

Я обнаружил, что Glade 2, когда его попросили добавить GtkComboBox, на самом деле вставил GtkComboBoxText (хотя в редакторе компонентов он отображается как тип GtkComboBox). Я обнаружил это только при просмотре автоматически сгенерированного кода interface.c.

Это создает виджет с «моделью» в нем и (я подозреваю) необходимый код для отображения одного столбца в этой модели (для «текста»). При добавлении нового столбца путем установки другой модели (исходный) рендерер визуализирует первый столбец.

Чтобы избавиться от исходного рендерера, решение вроде бы вызывает gtk_cell_layout_clear, и только потом добавляет новую модель + рендерер:

gtk_cell_layout_clear(GTK_CELL_LAYOUT(cbbox));

Сделайте это во время обработчика события realize для ComboBox, не изменяйте interface.c, так как оно будет перезаписано.

Я не уверен, что этого достаточно, чтобы освободить память для исходного рендерера.

person jcoppens    schedule 04.02.2021