简体   繁体   English

带有GtkListStore的GTKButton

[英]GTKButton with GtkListStore

I tried to add GTKButton to a GtkListStore to edit data in each row... The button doesn't appear, and i get this error message : "GLib-GObject-WARNING **: unable to set property text' of type gchararray' from value of type `GtkButton'". 我试图将GTKButton添加到GtkListStore以编辑每一行中的数据...该按钮没有出现,并且出现此错误消息:“ GLib-GObject-Warning **:无法设置text' of type gchararray的属性text' of type '从“ GtkButton”类型的值开始”。 here is my code : 这是我的代码:

#include <gtk/gtk.h>
GtkTreeModel * create_and_fill_model()
{
GtkListStore  *store;
GtkTreeIter    iter;
store = gtk_list_store_new (9,
                            G_TYPE_STRING,
                            G_TYPE_STRING,
                            G_TYPE_STRING,
                            G_TYPE_STRING,
                            G_TYPE_STRING,
                            G_TYPE_STRING,
                            G_TYPE_UINT,
                            G_TYPE_FLOAT,
                            GTK_TYPE_BUTTON);
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter,
                    0, "A5525654",
                    1, "DFFFCCN",
                    2, "Doe",
                    3, "John",
                    4, "M",
                    5, "casablanca",
                    6, 2014,
                    7, 18.22,
                    8,GTK_BUTTON(gtk_button_new_with_label("EDIT")),
                    -1);
return GTK_TREE_MODEL (store);
}
GtkWidget * create_view_and_model()
{
GtkCellRenderer     *renderer;
GtkTreeModel        *model;
GtkWidget           *view;

view = gtk_tree_view_new ();
char colonne[9][16] =
{
    "CIN",
    "CNE",
    "Nom",
    "Prenom",
    "Sexe",
    "Etablissement",
    "Annee Obt",
    "Note Gener",
    "Edit"
};
int i;
for(i=0; i<9; i++)
{
    renderer = gtk_cell_renderer_text_new ();
    gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view),
            -1,
            colonne[i],
            renderer,
            "text", i,
            NULL);
}
model = create_and_fill_model ();
gtk_tree_view_set_model (GTK_TREE_VIEW (view), model);
g_object_unref (model);
return view;
}
int main (int argc, char **argv)
{
GtkWidget *window;
GtkWidget *view;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect (window, "delete_event", gtk_main_quit, NULL);
view = create_view_and_model ();
gtk_container_add (GTK_CONTAINER (window), view);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}

Source code that works: 有效的源代码:

#include <gtk/gtk.h>

GtkTreeModel * create_and_fill_model()
{
GtkListStore  *store;
GdkPixbuf     *icon;
GError        *error = NULL;
GtkTreeIter    iter;
store = gtk_list_store_new (9,
                            G_TYPE_STRING,
                            G_TYPE_STRING,
                            G_TYPE_STRING,
                            G_TYPE_STRING,
                            G_TYPE_STRING,
                            G_TYPE_STRING,
                            G_TYPE_UINT,
                            G_TYPE_FLOAT,
                            GDK_TYPE_PIXBUF);
gtk_list_store_append (store, &iter);
icon = gdk_pixbuf_new_from_file("edit.png", &error);
gtk_list_store_set (store, &iter,
                    0, "A5525654",
                    1, "DFFFCCN",
                    2, "Doe",
                    3, "John",
                    4, "M",
                    5, "casablanca",
                    6, 2014,
                    7, 18.22,
                    8,icon,
                    -1);
if (error)
{
    g_warning ("probleme de chargement de l'icone : %s\n", error->message);
    g_error_free(error);
    error = NULL;
}
return GTK_TREE_MODEL (store);
}
GtkWidget * create_view_and_model()
{
GtkCellRenderer     *renderer;
GtkTreeModel        *model;
GtkWidget           *view;

view = gtk_tree_view_new ();
char colonne[9][16] =
{
    "CIN",
    "CNE",
    "Nom",
    "Prenom",
    "Sexe",
    "Etablissement",
    "Annee Obt",
    "Note Gener",
    "Edit"
};
int i;
for(i=0; i<9; i++)
{
    if(i==8)
    {
        renderer = gtk_cell_renderer_pixbuf_new();
        gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view),
                -1,
                colonne[i],
                renderer,
                "pixbuf", i,
                NULL);
    }
    else
    {
        renderer = gtk_cell_renderer_text_new ();
        gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view),
                -1,
                colonne[i],
                renderer,
                "text", i,
                NULL);
    }
}
model = create_and_fill_model ();
gtk_tree_view_set_model (GTK_TREE_VIEW (view), model);
g_object_unref (model);
return view;
}
int main (int argc, char **argv)
{
GtkWidget *window;
GtkWidget *view;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect (window, "delete_event", gtk_main_quit, NULL);
view = create_view_and_model ();
gtk_container_add (GTK_CONTAINER (window), view);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}

Your implementation of placing a button in tree view cannot work as written. 您在树状视图中放置按钮的实现无法按书面要求进行。 You are creating a text renderer for all the columns, and a text renderer obviously cannot draw a GTK button. 您正在为所有列创建一个文本渲染器,并且文本渲染器显然无法绘制GTK按钮。 (You get the error while setting the text property on the renderer based on a button-typed column in the model.) (在基于模型中按钮类型的列的渲染器上设置text属性时,会出现错误。)

One simple way of placing a button in a tree view is by putting a clickable image in the cell, as shown by this answer . 在树状视图中放置按钮的一种简单方法是将可点击的图像放置在单元格中, 如此答案所示。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM