【发布时间】: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;
}
【问题讨论】: