带有条目的 GtkComboBox 导致 `gtk_entry_set_text: assertion 'text != NULL' failed`

Posted

技术标签:

【中文标题】带有条目的 GtkComboBox 导致 `gtk_entry_set_text: assertion \'text != NULL\' failed`【英文标题】:GtkComboBox with entry causes `gtk_entry_set_text: assertion 'text != NULL' failed`带有条目的 GtkComboBox 导致 `gtk_entry_set_text: assertion 'text != NULL' failed` 【发布时间】:2021-05-27 01:03:44 【问题描述】:

我正在尝试编写一个带有条目的组合框,其中包含带有列表存储的文本。我的代码是基于the official gtk-demo的代码

问题:

当我创建一个带有条目的组合框时,

所有条目都居中 我无法选择任何条目 命令行显示 gtk_entry_set_text:断言 'text != NULL' 失败

代码

下面是我如何创建组合框(目前使用硬编码开关进行测试。

if (FALSE)
    
       // works fine
       combo = gtk_combo_box_new_with_model (model);
    
    else
    
       // Entries are centric
       // Cannot select entries
       // command line shows gtk_entry_set_text: assertion 'text != NULL' failed
       combo = gtk_combo_box_new_with_model_and_entry (model);
    

完整代码

#include <gtk/gtk.h>


enum

  TEXT_COL,
  ICON_NAME_COL

;



static GtkTreeModel *
create_icon_store (void)
    
  const gchar *labels[6] = 
    ("Warning"),
    ("Stop"),
    ("New"),
    ("Clear"),
    ("Open")
  ;

  GtkTreeIter iter;
  GtkListStore *store;
  gint i;

  store = gtk_list_store_new (1, G_TYPE_STRING);

  for (i = 0; i < G_N_ELEMENTS (labels); i++)
    
       gtk_list_store_append (store, &iter);
       gtk_list_store_set (store, &iter,
                           TEXT_COL, (labels[i]),
                           -1);   
    

  return GTK_TREE_MODEL (store);




void create_gui(GtkContainer *container)

   GtkWidget *combo;
   GtkTreeModel *model;
   GtkCellRenderer *renderer;
   GtkTreeIter iter;

    model = create_icon_store ();
    if (FALSE)
    
       // works fine
       combo = gtk_combo_box_new_with_model (model);
    
    else
    
       // Entries are centric
       // Cannot select entries
       // command line shows gtk_entry_set_text: assertion 'text != NULL' failed
       combo = gtk_combo_box_new_with_model_and_entry (model);
    
    
    g_object_unref (model);
    gtk_container_add (container, combo);


    renderer = gtk_cell_renderer_text_new ();
    gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, TRUE);
    gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), renderer,
                                    "text", TEXT_COL,
                                    NULL);

    gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);   
    



/**
 *  standard stuff. Check out create_gui() 
 **/
int main(int argc, char *argv[])

  gtk_init (&argc, &argv);

  GtkWidget *window;
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

  GtkWidget * box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
  gtk_container_add (GTK_CONTAINER (window), box);

  create_gui (GTK_CONTAINER (box));

  g_signal_connect (G_OBJECT (window), "destroy",
                    G_CALLBACK (gtk_main_quit), G_OBJECT (window));

  gtk_widget_show_all(window);
  gtk_main();

  return 0;

【问题讨论】:

【参考方案1】:

说明

    您需要告诉 GtkEntry(组合框的)应该使用哪一列: 你可以用gtk_combo_box_set_entry_text_column 您还应该指定gtk_combo_box_set_id_column(不知道为什么,但 gtk 会这样做) 当您使用gtk_combo_box_set_entry_text_column 时,您不再需要自己的渲染器;否则,您将显示两列。

通用代码

这是一个函数,它将创建一个组合框,其中包含一个带有一个文本列的列表存储条目 (G_TYPE_STRING)

/**
 * Creates a combo box for list store with one text column.
 *    (= ComboBoxText)
 * The combo box will own `model`. No `g_object_unref` needed.
 */
GtkComboBox *
create_combo_box_with_entry(GtkListStore *model)

   GtkWidget *combo;   

   combo = gtk_combo_box_new_with_model_and_entry (GTK_TREE_MODEL (model));   
   g_object_unref (model);

   // Note: You don't need to use an a renderer, if you have 
   //      a simple ComboBox for text with an entry, because
   //      the following functions will setup a renderer     
   gtk_combo_box_set_entry_text_column (GTK_COMBO_BOX (combo), 0);
   gtk_combo_box_set_id_column (GTK_COMBO_BOX (combo), 0);

   return GTK_COMBO_BOX (combo);

【讨论】:

我不确定我是否可以关注这篇文章。你在问什么,然后你给它一个解释。这听起来像是 Tutorial 对我来说,这绝对不是 SO 的意思。 我在问一些事情,自己想出了解决方案,将其概括,然后发布。请指出那个地方,如果我在此期间找到了解决方案,我不应该正确回答我自己的问题。 重要的不是你在做什么,更重要的是你是怎么做的。 自答其实是encouraged,@Michi

以上是关于带有条目的 GtkComboBox 导致 `gtk_entry_set_text: assertion 'text != NULL' failed`的主要内容,如果未能解决你的问题,请参考以下文章

如何格式化 Gtk.Entry 中的条目

在 Python-GTK3 中设置条目文本的 set_text 在哪里?

当条目在 Gtk Python 中获得焦点时如何更改输入语言

扩展器内带有树视图的 Gtk 3.0 窗口

是啥导致不同 GTK 版本之间 GtkIconView 的显示行为不同?

GTK#:带有过滤和排序的树视图