问题描述
我意识到 GTK-2 现在是“古董”了。我有一个必须修改的旧程序,它太大了,无法在我拥有的时间内转换为 GTK-3。这是问题:
- 我添加了一个 ComboBox,我为其分配了一个包含 2 列(G_TYPE_INT 和 G_TYPE_STRING)的 ListBox。
- 出于某种原因,两列都显示在 ComboBox 上,但我认为下面显示的代码只分配了一个。
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 的第二列。
但是,不知什么原因,我无法去掉第一列。我已经扫描了 整个项目可能会影响代码的迹象 - 没有运气。界面是 使用 Glade-2 生成。
在过去的几年里,我更多地使用 Python 工作,所以我怀疑有什么东西 我在这里失踪了。我什至基本上用 Python 测试了这段代码,没有问题。
我很感激建议!
解决方法
问题解决了!
我发现 Glade 2 在要求添加 GtkComboBox
时实际上插入了 GtkComboBoxText
(即使在组件编辑器中它显示为 GtkComboBox
类型)。我只在浏览自动生成的 interface.c
代码时检测到这一点。
这将创建一个带有“模型”的小部件,以及(我怀疑)用于呈现该模型中的单列(对于“文本”)的必要代码。添加新列时,通过设置另一个模型,(原始)渲染器正在渲染第一列。
去掉原来的渲染器,解决办法好像是调用gtk_cell_layout_clear
,然后才添加新的模型+渲染器:
gtk_cell_layout_clear(GTK_CELL_LAYOUT(cbbox));
在 realize
的 ComboBox
事件处理程序期间执行此操作,不要修改 interface.c
,因为它会被覆盖。
我不确定这是否足以为原始渲染器释放任何内存。