【问题标题】:Gtk.Combobox displays two columns (instead of 1), Why?Gtk.Combobox 显示两列(而不是一列),为什么?
【发布时间】:2021-01-27 12:27:55
【问题描述】:

我意识到 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), 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 的第二列。

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

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

非常感谢您的建议!

【问题讨论】:

    标签: c glade gtk2


    【解决方案1】:

    问题解决了!

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

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

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

    gtk_cell_layout_clear(GTK_CELL_LAYOUT(cbbox));
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-09
      • 2014-12-01
      • 2011-11-21
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      相关资源
      最近更新 更多