2011-07-13 50 views
4

私は以下のことを達成しようとしています:Applyをクリックすると、Applyを複数回入力してからApplyをクリックすることができます。信号を発信するためのボタン、このような何か:c - 複数の引数をGTKのコールバック関数に渡す

g_signal_connect(G_OBJECT(適用)、 "クリック"、 G_CALLBACK(apply_clicked)、#引数#)。

その後、apply_clicked()に、入力したテキストを保存します。

私の質問は:gtk_entryをコールバック関数apply_clickedに渡すにはどうすればいいですか? 1つだけの場合は、それを# an argument #と設定しましたが、複数のエントリはどうすればよいですか?

答えて

5

これを行うための一般的な方法は、実行することです:

apply_clickedで
g_object_set_data (context_object, "entry1", entry1); 
g_object_set_data (context_object, "entry2", entry2); 

g_signal_connect (G_OBJECT (Apply), "clicked", G_CALLBACK (apply_clicked), context_object); 

、その後:

GtkEntry *entry1 = g_object_get_data (context_object, "entry1"); 
... 

通常context_objectはGtkDialogになりますか、これらのウィジェットは、上に存在するものは何でも。あなたのダイアログ、ちょうど設定entry1を、2、3、などを構築する際に、次に

struct _MyDialog { 
    GtkDialog parent_object; 
    GtkEntry *entry1; 
    GtkEntry *entry2; 
    ... 
}; 

を...あなたが使用する必要はありません:あなたはGtkDialogをサブクラス化する場合

あるいは、あなたが行うことができますg_object_ [g、s] et_data()ハック

+0

さて、私はあなたの最初のアプローチを使用しているので、あなたが指摘したように、テキストを取得したいと思います: 'gchar * string = gtk_entry_get_text(GTK_ENTRY(entry1));'作業 - '割当てはポインタのターゲット型からconst '修飾子を破棄する' - なぜですか? – tesseract

+0

'gtk_entry_get_text()'は 'char *'ではなく 'const char *'を返します。コードを 'const gchar * string = gtk_entry_get_text(GTK_ENTRY(entry1));'に変更し、コンパイルする必要があります。 – jstedfast

+0

さて、ありがとう、私はそれを見落とした。 :) – tesseract

1

gtk_entryへのポインタを含むデータ構造(おそらくリンクされたリスト)を作成し、その代わりに渡します。または、より良いのは、なぜが含まれているオブジェクトへのポインタを渡すだけで、これらのすべてがgtk_entryですか?

+0

このアプローチの問題は、メモリ管理です。なぜなら、不要になったときに削除できるどこかにリストを保存する必要があるからです。あなたはGtkDialogに貼り付けることができますが、代わりに私の代わりの提案を使用するのはなぜですか? :) – jstedfast

関連する問題