Gtk.Combobox 显示两列(而不是 1 列),为什么?
Gtk.Combobox displays two columns (instead of 1), Why?
我知道 GTK-2 现在是 'antique'。我有一个必须修改的旧程序,而且它太大了,无法转换为 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), 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));
在 ComboBox
的 realize
事件处理程序期间执行此操作,不要 修改 interface.c
,因为它将被覆盖。
虽然我不确定这是否足以释放任何内存给原始渲染器。
我知道 GTK-2 现在是 'antique'。我有一个必须修改的旧程序,而且它太大了,无法转换为 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), 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));
在 ComboBox
的 realize
事件处理程序期间执行此操作,不要 修改 interface.c
,因为它将被覆盖。
虽然我不确定这是否足以释放任何内存给原始渲染器。