带有条目的 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`的主要内容,如果未能解决你的问题,请参考以下文章
在 Python-GTK3 中设置条目文本的 set_text 在哪里?
当条目在 Gtk Python 中获得焦点时如何更改输入语言