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

问题描述

我意识到 GTK-2 现在是“古董”了。我有一个必须修改的旧程序,它太大了,无法在我拥有的时间内转换为 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),"text",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,1,"Kind 1",-1);
      gtk_list_store_append(store,&iter);
      gtk_list_store_set(store,"Kind 2",&iter);

这是在小部件的“实现”信号上调用函数的一部分。 将 ..."text",0... 更改为 ..."text",1... 正如预期的那样,ComboBox 到 ListStore 的第二列。

Capture of the (opened) Combobox,showing 2 fields

但是,不知什么原因,我无法去掉第一列。我已经扫描了 整个项目可能会影响代码的迹象 - 没有运气。界面是 使用 Glade-2 生成

在过去的几年里,我更多地使用 Python 工作,所以我怀疑有什么东西 我在这里失踪了。我什至基本上用 Python 测试了这段代码,没有问题。

我很感激建议!

解决方法

问题解决了!

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

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

去掉原来的渲染器,解决办法好像是调用gtk_cell_layout_clear,然后才添加新的模型+渲染器:

gtk_cell_layout_clear(GTK_CELL_LAYOUT(cbbox));

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

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