-1

入力ボックス、ラベル、およびボタンで満たされたテーブルがあります。

現在、コードをコンパイルすると、テキスト ボックスから入力を取得できますが、ユーザーが Enter キーを押した場合にのみ、テキストは現在入力しているボックスからのみ取得されます。

「ログイン」ボタンを押したときに、両方のテキスト ボックスから入力できるようにしたいと考えています。入力ボックスのエンターキーと同じコールバック関数を使用してみましたが、GTK でエラーが発生します。

テーブル内にある入力ボックスからテキストを取得できるコードを誰かが教えてくれたら (テーブルと v/boxes からデータを取得する方法が異なることは知っています)、それは大歓迎です。どのチュートリアルでも見つけられないようです。

作業コードで更新されます。

ステータス バーをテーブルに追加しようとするとエラーが発生しました:

(エントリ:5526): Gtk-CRITICAL **: gtk_table_attach: アサーション `child->parent == NULL' が失敗しました

(エントリ:5526): GLib-GObject-WARNING **: GtkTable' toGtkStatusbar からの無効なキャスト'

4

1 に答える 1

4

コールバック関数 (名前はcallback) は、値を取得するために両方の GtkEntry ウィジェットにアクセスする必要があります。これを行う方法はいくつかあります。多くの GTK C プログラムは、グローバル変数、またはファイル スコープを持つグローバル変数 (つまり、staticファイル内の任意の関数の外部として宣言された変数) を使用します。

関数の前に、ファイルの上部近くにある変数entry1と変数を削除します。entry2

static GtkWidget *entry1 = 0;
static GtkWidget *entry2 = 0;

次に、コールバックを次のように変更します。

/* Our callback.
 * The data passed to this function is printed to stdout */
static void callback( GtkWidget *widget, gpointer data)
{
    const gchar *entry_text1;
    const gchar *entry_text2;

    g_print ("Hello again - %s was pressed\n", (char *) data);

    entry_text1 = gtk_entry_get_text (GTK_ENTRY (entry1));
    entry_text2 = gtk_entry_get_text (GTK_ENTRY (entry2));
    g_print ("Contents of entries:\n%s\n%s\n", entry_text1, entry_text2);
}

さらに、関数に同様の変更を加える必要があります。また、両方へのポインターをからenter_callback削除することを忘れないでください。GtkWidgetGtkEntrymain


(静的) グローバル変数を使用する代わりに、エントリを保持するデータ構造を作成します。

typedef struct login_data
{
    GtkWidget *entry1;
    GtkWidget *entry2;
} login_data;

これは (以前のテキスト文字列ではなく) コールバックに渡され、コールバックは次のように変更されます。

static void callback( GtkWidget *widget, gpointer data)
{
    login_data* ld = (login_data*)data;
    const gchar *entry_text1;
    const gchar *entry_text2;

    entry_text1 = gtk_entry_get_text (GTK_ENTRY (ld->entry1));
    entry_text2 = gtk_entry_get_text (GTK_ENTRY (ld->entry2));
    g_print ("Contents of entries:\n%s\n%s\n", entry_text1, entry_text2);
}

データ構造は、スコープ外に出ないように動的に割り当てられます (単純なアプリケーションでは厳密には必要ありません)。これはg_signal_connect、コールバックをエントリに接続するために使用する前に行われます。

login_data* ld = g_malloc(sizeof(*ld));

// callback function to execute when login is clicked
g_signal_connect (LoginButton, "clicked", G_CALLBACK (callback), (gpointer) ld);

この方法を使用すると、 および へのすべての参照をentry1およびentry2に変更する必要がld->entry1ありld->entry2ます。最後に、プログラムが終了する前にg_free、動的に割り当てられた struct ieを呼び出す必要がありますg_free(ld)

ところで、このプログラムでは、2 つの個別のコールバックは必要ありません。削除して両方enter_callbackに使用してください。callback

于 2013-07-28T00:05:17.810 に答える