Gtk.Combobox 显示两列(而不是 1 列),为什么?

Gtk.Combobox displays two columns (instead of 1), Why?

我知道 GTK-2 现在是 'antique'。我有一个必须修改的旧程序,而且它太大了,无法转换为 GTK-3。这是问题:

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

这是在小部件的 'realize' 信号上调用的函数的一部分。 将 ..."text", 0... 更改为 ..."text", 1... 更改第二列 ComboBox 到 ListStore 的第二列。

但是,由于未知原因,我无法删除第一列。我已经扫描了 整个项目的代码迹象可能会影响 - 运气不好。界面是 使用 Glade-2 生成。

在过去的几年里,我一直在 Python 工作,所以我怀疑有什么 我在这里失踪了。我什至在 Python 中基本上测试了这段代码,没有问题。

非常感谢您的建议!

问题已解决!

我发现 Glade 2,当要求添加一个 GtkComboBox 时,实际上插入了一个 GtkComboBoxText(即使在组件编辑器中它显示为 GtkComboBox 类型) .我只是在浏览自动生成的 interface.c 代码时才检测到这一点。

这将创建一个带有 'model' 的小部件,以及(我怀疑)在该模型中呈现单个列的必要代码(对于 'text')。添加新列时,通过设置另一个模型,(原始)渲染器正在渲染第一列。

要摆脱原来的渲染器,解决方案似乎是调用gtk_cell_layout_clear,然后才添加新模型+渲染器:

gtk_cell_layout_clear(GTK_CELL_LAYOUT(cbbox));

ComboBoxrealize 事件处理程序期间执行此操作,不要 修改 interface.c,因为它将被覆盖。

虽然我不确定这是否足以释放任何内存给原始渲染器。