1

次の問題があります。gtktreeviewMySQL データベースから取得したデータを表示するために使用するアプリケーションを開発しています。

のいくつかの例を既に実行しまし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;

リストのセットアップ (パラメーターで列名を渡すことと、1 つの列のみを使用することを除いて、ほとんど同じです):

    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 つの違いは、アプリケーションで複数のリストを作成していることです。これが問題の原因であるかどうかを確認するために、1 つのリストを除くすべてのリストを削除しましたが、何も変わりませんでした。

また、リストに入力フィールドとボタントリガーを追加しようとしましたが、何も変わりませんでした. また、列挙型を使用して変数の宣言を並べ替えてみましたが、結果にも影響はありませんでした。

役立つものは何も見つかりませんでした。アイデアがありません。助けてください。私はこれをできるだけ明確に説明しようとしてきました.質問をして、私と私の投稿を修正してください. ありがとう。

4

1 に答える 1