单元格中的 GTK 组合框
GTK combo box in cell
我正在编写 GUI,在一个 window 我有一个列表,每行包含 3 列。
第一列是 int - 这里很简单,我给属性 "text" 并传递 int 值。我不确定它是否正确,但它有效。
第 3 列是图标 - 属性是 "icon-name",传递带有图标名称的字符串,效果很好。
第 2 列是一个组合框 - 属性是一个 "model",传递的是一个 GTKtreeModel,但它不起作用我尝试了不同的变体,但没有任何效果。
所以,思路是用gtk_cell_renderer_combo_new();传递模型并将我的第二列作为组合框。但是现在我得到了这个:
GLib-GObject-WARNING **: unable to set property 'model' of type
'GtkTreeModel' from value of type 'gchararray'
我没有找到任何 material 或有关如何在树中制作组合框的文档。有什么想法吗?
GtkWidget *type_list = gtk_tree_view_new(); //creating a main list
GtkCellRenderer *render;
render = gtk_cell_renderer_text_new (); // first column is text
GtkTreeViewColumn* row_n = gtk_tree_view_column_new_with_attributes("#",render,"text",0, NULL); // name and type
gtk_tree_view_append_column(GTK_TREE_VIEW(type_list), row_n); //insert attribute into list
render = gtk_cell_renderer_combo_new (); //second column is combo
GtkTreeViewColumn* type_colomn = gtk_tree_view_column_new_with_attributes("Type",render, "model" , 1, NULL); // name and type - model as GTK doc said it must be model
gtk_tree_view_append_column(GTK_TREE_VIEW(type_list), type_colomn); // insert attribute into list
render = gtk_cell_renderer_pixbuf_new(); // third column is icon
GtkTreeViewColumn* delete_raw = gtk_tree_view_column_new_with_attributes("Delete",render, "icon-name", 2, NULL); // name and type icon-name to pass image from stock
gtk_tree_view_append_column(GTK_TREE_VIEW(type_list), delete_raw); // insert attribute into list
GtkListStore *store = gtk_list_store_new(3,G_TYPE_INT,G_TYPE_STRING,G_TYPE_STRING); // describe list storage; 3 types, int, string, string, I'm not sure if it correct
//creating list of options
GtkTreeIter itr;
gtk_list_store_append(store,&itr);
int num = 1;
const gchar *type[] = {"1 option", "2 option", "3 option", "4 option", "5 option"};
GtkListStore *list = gtk_list_store_new(1,G_TYPE_STRING); //creating list store to pass in combo
for (int i=0;i++<4;){
gtk_list_store_insert_with_values(list,NULL,-1, 0,type[i-1],-1); // insert values into list
}
//____________________________
//g_object_set (G_OBJECT (render_combo), "model",list,"editable", TRUE,NULL); // unsuccessful try with g_object_set
gtk_list_store_set(store, &itr, 0, num, 1,GTK_TREE_MODEL(list), 2, "edit-delete", -1); //insert data to the row
gtk_tree_view_set_model(GTK_TREE_VIEW(type_list),GTK_TREE_MODEL(store));
g_object_unref (G_OBJECT (store)); // free memory
g_object_unref (G_OBJECT (list)); // free memory
gtk_container_add(GTK_CONTAINER(node_type),type_list);
您需要为组合框模型创建一个新商店。与树视图完全不同的一个。然后将此商店设置为组合框模型 属性。然后将此行更改为:
GtkTreeViewColumn* type_colomn = gtk_tree_view_column_new_with_attributes("Type",render, "text" , 1, NULL); // name and type - model as GTK doc said it must be model
因为您没有在模型中存储模型。您正在树视图列中呈现树视图模型的文本。
组合框是一个完全独立的对象,在编辑单元格(单击两次)时弹出。
我会 post 一些 C 示例,但我最了解 Python 并且从未在 C 中这样做过。
感谢@theGtknerd 解释了传递给商店模型的确切内容。
如果有人遇到同样的问题,我会在我的答案底部包含的网站上找到解决方案。使组合框工作的最重要的行是:
g_object_set(render, "model", combo_list, "text-column", 0, "has-entry", FALSE, "editable", TRUE, (char *)NULL);
在结果中我们有以下列:
render = gtk_cell_renderer_combo_new ();
//creating a list for combo box
const gchar *type[] = {"option 1", "option 2", "option 3", "option 4", "option 5"};
GtkListStore *combo_list = gtk_list_store_new(1,G_TYPE_STRING); // list for combo box
for (int i=0;i++<=4;){
gtk_list_store_insert_with_values(combo_list,NULL,-1, 0,type[i-1],-1);
}
//____returning list, free list at line 309
g_object_set(render, "model", combo_list, "text-column", 0, "has-entry", FALSE, "editable", TRUE, (char *)NULL);
//g_signal_connect(render, "editing-started", G_CALLBACK(/*on_tree_cell_combo_editing_start*/), NULL);
GtkTreeViewColumn* type_colomn = gtk_tree_view_column_new_with_attributes("Type",render, "text" , 1, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(type_list), type_colomn);
插入新行的示例是:
GtkListStore *store = gtk_list_store_new(3,G_TYPE_UINT,G_TYPE_STRING,G_TYPE_STRING);
GtkTreeIter itr;
gtk_list_store_append(store,&itr);
int num = 1;
gtk_list_store_set(store, &itr, 0, num, 1,"char", 2, "edit-delete", -1);
这里有一个对我有帮助的很好的例子:
GTK cell combo box example
我正在编写 GUI,在一个 window 我有一个列表,每行包含 3 列。
第一列是 int - 这里很简单,我给属性 "text" 并传递 int 值。我不确定它是否正确,但它有效。
第 3 列是图标 - 属性是 "icon-name",传递带有图标名称的字符串,效果很好。
第 2 列是一个组合框 - 属性是一个 "model",传递的是一个 GTKtreeModel,但它不起作用我尝试了不同的变体,但没有任何效果。
所以,思路是用gtk_cell_renderer_combo_new();传递模型并将我的第二列作为组合框。但是现在我得到了这个:
GLib-GObject-WARNING **: unable to set property 'model' of type 'GtkTreeModel' from value of type 'gchararray'
我没有找到任何 material 或有关如何在树中制作组合框的文档。有什么想法吗?
GtkWidget *type_list = gtk_tree_view_new(); //creating a main list
GtkCellRenderer *render;
render = gtk_cell_renderer_text_new (); // first column is text
GtkTreeViewColumn* row_n = gtk_tree_view_column_new_with_attributes("#",render,"text",0, NULL); // name and type
gtk_tree_view_append_column(GTK_TREE_VIEW(type_list), row_n); //insert attribute into list
render = gtk_cell_renderer_combo_new (); //second column is combo
GtkTreeViewColumn* type_colomn = gtk_tree_view_column_new_with_attributes("Type",render, "model" , 1, NULL); // name and type - model as GTK doc said it must be model
gtk_tree_view_append_column(GTK_TREE_VIEW(type_list), type_colomn); // insert attribute into list
render = gtk_cell_renderer_pixbuf_new(); // third column is icon
GtkTreeViewColumn* delete_raw = gtk_tree_view_column_new_with_attributes("Delete",render, "icon-name", 2, NULL); // name and type icon-name to pass image from stock
gtk_tree_view_append_column(GTK_TREE_VIEW(type_list), delete_raw); // insert attribute into list
GtkListStore *store = gtk_list_store_new(3,G_TYPE_INT,G_TYPE_STRING,G_TYPE_STRING); // describe list storage; 3 types, int, string, string, I'm not sure if it correct
//creating list of options
GtkTreeIter itr;
gtk_list_store_append(store,&itr);
int num = 1;
const gchar *type[] = {"1 option", "2 option", "3 option", "4 option", "5 option"};
GtkListStore *list = gtk_list_store_new(1,G_TYPE_STRING); //creating list store to pass in combo
for (int i=0;i++<4;){
gtk_list_store_insert_with_values(list,NULL,-1, 0,type[i-1],-1); // insert values into list
}
//____________________________
//g_object_set (G_OBJECT (render_combo), "model",list,"editable", TRUE,NULL); // unsuccessful try with g_object_set
gtk_list_store_set(store, &itr, 0, num, 1,GTK_TREE_MODEL(list), 2, "edit-delete", -1); //insert data to the row
gtk_tree_view_set_model(GTK_TREE_VIEW(type_list),GTK_TREE_MODEL(store));
g_object_unref (G_OBJECT (store)); // free memory
g_object_unref (G_OBJECT (list)); // free memory
gtk_container_add(GTK_CONTAINER(node_type),type_list);
您需要为组合框模型创建一个新商店。与树视图完全不同的一个。然后将此商店设置为组合框模型 属性。然后将此行更改为:
GtkTreeViewColumn* type_colomn = gtk_tree_view_column_new_with_attributes("Type",render, "text" , 1, NULL); // name and type - model as GTK doc said it must be model
因为您没有在模型中存储模型。您正在树视图列中呈现树视图模型的文本。
组合框是一个完全独立的对象,在编辑单元格(单击两次)时弹出。
我会 post 一些 C 示例,但我最了解 Python 并且从未在 C 中这样做过。
感谢@theGtknerd 解释了传递给商店模型的确切内容。 如果有人遇到同样的问题,我会在我的答案底部包含的网站上找到解决方案。使组合框工作的最重要的行是:
g_object_set(render, "model", combo_list, "text-column", 0, "has-entry", FALSE, "editable", TRUE, (char *)NULL);
在结果中我们有以下列:
render = gtk_cell_renderer_combo_new ();
//creating a list for combo box
const gchar *type[] = {"option 1", "option 2", "option 3", "option 4", "option 5"};
GtkListStore *combo_list = gtk_list_store_new(1,G_TYPE_STRING); // list for combo box
for (int i=0;i++<=4;){
gtk_list_store_insert_with_values(combo_list,NULL,-1, 0,type[i-1],-1);
}
//____returning list, free list at line 309
g_object_set(render, "model", combo_list, "text-column", 0, "has-entry", FALSE, "editable", TRUE, (char *)NULL);
//g_signal_connect(render, "editing-started", G_CALLBACK(/*on_tree_cell_combo_editing_start*/), NULL);
GtkTreeViewColumn* type_colomn = gtk_tree_view_column_new_with_attributes("Type",render, "text" , 1, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(type_list), type_colomn);
插入新行的示例是:
GtkListStore *store = gtk_list_store_new(3,G_TYPE_UINT,G_TYPE_STRING,G_TYPE_STRING);
GtkTreeIter itr;
gtk_list_store_append(store,&itr);
int num = 1;
gtk_list_store_set(store, &itr, 0, num, 1,"char", 2, "edit-delete", -1);
这里有一个对我有帮助的很好的例子: GTK cell combo box example