gtktreeview在示例中工作正常,但一旦复制到应用程序就会停止

时间:2013-06-07 12:33:05

标签: c gtk gtktreeview

我有以下问题。我正在开发一个使用gtktreeview来显示从MySQL数据库中检索的数据的应用程序。

我已经完成了gtktreeview的几个例子,我可以添加,清除,从列表中删除。现在我想让这个例子适应我的应用程序,突然它不再起作用了。

以下是我使用的工作的示例。

枚举:

    static enum {
        FIRST_NAME,
        LAST_NAME,
        N_COL
    };

变量:

    static GtkWidget *list;
    static GtkWidget *f_entry;
    static GtkWidget *l_entry;

列表的设置:

    static GtkWidget *setup_list()
    {
        GtkWidget *sc_win;
        GtkListStore *store;
        GtkCellRenderer *cell;
        GtkTreeViewColumn *column;

        sc_win = gtk_scrolled_window_new(NULL, NULL);
        gtk_widget_set_usize(sc_win, 250, 150);
        store = gtk_list_store_new(N_COL, G_TYPE_STRING, G_TYPE_STRING);
        list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
        cell = gtk_cell_renderer_text_new();

        // column of the names
        column = gtk_tree_view_column_new_with_attributes("Imię", cell, "text", FIRST_NAME, NULL);
        gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);

        // column of the surnames
        column = gtk_tree_view_column_new_with_attributes("Nazwisko", cell, "text", LAST_NAME, NULL);
        gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);

        // scrolls
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sc_win), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
        gtk_container_add(GTK_CONTAINER(sc_win), list);

        // free the store variable and return the scrolled window pointer
        g_object_unref(G_OBJECT(store));
        return sc_win;
    }

添加元素的函数:

    static void list_add_cb(GtkWidget* widget, gpointer data)
    {
        GtkListStore *store;
        GtkTreeIter iter;
        const char *first;
        const char *last;

        first = gtk_entry_get_text(GTK_ENTRY(f_entry));
        last = gtk_entry_get_text(GTK_ENTRY(l_entry));
        store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list)));

        gtk_list_store_append(store, &iter);
        gtk_list_store_set(store, &iter, FIRST_NAME, first, LAST_NAME, last, -1);
    }

这是我申请中的等效内容。

枚举:

    enum {
        ID_ALIAS,
        N_COL
    };

变量(仅对示例有重要意义):

    static GtkWidget *list_pas;
    static GtkWidget *list_key;

列表的设置(几乎是一致的,除了在参数中传递列名和仅使用一列):

    static GtkWidget *setup_list(char *typ)
    {
        GtkWidget *sc_win;
        GtkWidget *list;
        GtkListStore *store;
        GtkCellRenderer *cell;
        GtkTreeViewColumn *column;

        sc_win = gtk_scrolled_window_new(NULL, NULL);
        gtk_widget_set_usize(sc_win, 250, 150);
        store = gtk_list_store_new(N_COL, G_TYPE_STRING, G_TYPE_STRING);
        list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
        cell = gtk_cell_renderer_text_new();

        column = gtk_tree_view_column_new_with_attributes(typ, cell, "text", ID_ALIAS, NULL);
        gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);

        // scrolls
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sc_win), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
        gtk_container_add(GTK_CONTAINER(sc_win), list);

        // free the store variable and return the scrolled window pointer
        g_object_unref(G_OBJECT(store));
        return sc_win;
    }

添加元素的函数(在data中有一个要添加到列表中的元素的字符串,在widget中有一个包含正确列表的滚动窗口):

    static void list_add_cb(GtkWidget* widget, gpointer data)
    {
        GtkListStore *store;
        GtkTreeIter iter;
        store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(widget)));

        gtk_list_store_append(store, &iter);
        gtk_list_store_set(store, &iter, ID_ALIAS, (char *) data*, -1);
    }

由于每次MySQL函数尝试在其字段中写入数据时出现以下错误,它无效:

    (app_0:3642): GLib-GObject-WARNING **: invalid cast from `GtkScrolledWindow' to `GtkTreeView'

    (app_0:3642): Gtk-CRITICAL **: IA__gtk_tree_view_get_model: assertion `GTK_IS_TREE_VIEW (tree_view)' failed

    (app_0:3642): Gtk-CRITICAL **: IA__gtk_list_store_append: assertion `GTK_IS_LIST_STORE (list_store)' failed

    (app_0:3642): Gtk-CRITICAL **: IA__gtk_list_store_set_valist: assertion `GTK_IS_LIST_STORE (list_store)' failed

以下是如何调用添加行的功能:

    list_add_cb(list, row[i] ? row[i] : "NULL");

我还会说,当我打印row[i] ? row[i] : "NULL"时,我得到了正确的值。

我的应用程序的MySQL部分工作得很好。编译时我得到的唯一警告useless class storage specifier in empty declaration我在此研究过,在stackoverflow.com上我已经了解到这与此问题无关。

另一个区别是我在我的应用程序中创建了多个列表。为了验证这是否是问题的根源,我删除了除一个列表之外的所有列表,但这没有任何改变。

我一直在尝试使用输入字段和按钮触发器对列表进行充电,但这并没有改变任何东西。我也尝试使用枚举重新排序变量的声明,这对结果都没有影响。

我没有找到任何有用的东西,我没有想法,请帮忙。我一直试图尽可能清楚地解释这个问题,请提出问题并纠正我和我的帖子。感谢。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。不幸的是,我不知道为什么它能解决这个问题。

正如用户ntd在评论中所说我使用GtkScrolledWindow来附加列表,我虽然没关系,因为它在示例中是这样的,但在示例中有次要变量,而不是{{1中的全局变量我没注意到的功能。非常感谢你的观点。

第二件事是使用多个列表。函数main必须加倍。有趣的是,我无法在此函数的参数中传递static GtkWidget *setup_list(char *typ)对象,但是一旦我创建了两个函数gtktreeviewsetup_list(char *typ),其中唯一的区别是变量用于存储setup_list2(char *typ)

我真的不知道它为什么会这样工作,如果有人有想法我会很高兴。无论如何我很高兴,因为我的项目现在可以更进一步。干杯啦!