XMLファイルから構築されたGTKウィンドウがあるC言語のグラフィックスプログラムを作成しています。このウィンドウにはそれぞれに対応するいくつかのボタンとハンドラがあります(たとえば、ボタンが "円"と表示され、 "on_circle_clicked()"というハンドラがある場合)。これらのボタンがクリックされたときにイベントを処理したい。これはどうすればいいですか?XMLファイルから構築されたgtkwidgetからのイベントの処理
0
A
答えて
2
信号処理コードはシグナルハンドラに入ります。あなたの例によると、 "on_circle_clicked"として "clicked"のシグナルハンドラを持つボタン "circle"の場合、ボタンがクリックされると、on_circle_clickedは&と呼ばれ、そのボタンをクリックする処理を行うロジックを持ちます。これを行うには、glade(使用しているXMLファイルの種類を生成する)を使用して、xmlファイルの作成中にウィジェットのシグナルハンドラの名前を追加します。これらのシグナルハンドラは、ソースコードで実装する必要があります。あなたはtheselinksが役に立ちます。ご参考のためにサンプルの下に見つけてください:gtk_builder_connect_signals
のドキュメントで述べたように
- :あなたが気をつけなければなりません
SAMPLE.C/* Compile as :gcc sample.c -Wall -Wextra -Wl,--export-dynamic `pkg-config --cflags --libs gtk+-3.0 gmodule-export-2.0` -o sample */ #include <gtk/gtk.h> void on_circle_clicked(GtkButton * b, gpointer data) { (void)b; (void)data; printf(" Circle clicked\n"); } int main(int argc, char **argv) { GtkBuilder *builder; GtkWidget *window; GError *err = NULL; const char *builder_file = "sample.glade"; gtk_init(&argc, &argv); builder = gtk_builder_new(); if (gtk_builder_add_from_file(builder, builder_file, &err) == 0) { fprintf(stderr, "Error adding builder from file %s\n%s\n", builder_file, err->message); return -1; } gtk_builder_connect_signals(builder, NULL); window = GTK_WIDGET(gtk_builder_get_object(builder, "window")); if (window == NULL) { fprintf(stderr, " Object window not found\n"); return -2; } gtk_widget_show_all(window); gtk_main(); return 0; }
sample.glade
<?xml version="1.0" encoding="UTF-8"?> <interface> <!-- interface-requires gtk+ 3.0 --> <object class="GtkWindow" id="window"> <property name="can_focus">False</property> <property name="title" translatable="yes">Glade sample</property> <property name="has_resize_grip">False</property> <signal name="destroy" handler="gtk_main_quit" swapped="no"/> <child> <object class="GtkButton" id="circle"> <property name="label" translatable="yes">circle</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_action_appearance">False</property> <signal name="clicked" handler="on_circle_clicked" swapped="no"/> </object> </child> </object> </interface>
物事を、あなたのプログラムを
-Wl,--export-dynamic
でコンパイルする必要があります。Linux/Unix上のCフラグ& link togmodule-export-2.0
。 Windowsでは、シグナルハンドラの前にG_MODULE_EXPORT
を追加する必要があります。 - シグナルハンドラのシンボルが検索されると、はは(GCCとの「隠された」として機能するために可視属性を設定例えば)
static
機能や非表示としての機能を、それをしない
お役に立てれば!
関連する問題
- 1. モバイルスパークコンポーネントから送出されたASファイル内のイベントを処理します
- 2. 反復処理XMLファイルとそれから
- 3. バイナリツリーがファイルから再構築されない
- 4. ファイルメニューからイベントを処理する
- 5. 与えられたポストオーダートラバーサルからのBSTの構築
- 6. Matplotlib - リスト内のアイテムから構築されたポイントラベル
- 7. infopathから構築されたシェイプフォームは安全ですか?
- 8. バインドされたキャンバスWPFのイベント処理
- 9. ファイルからツリーを再構築
- 10. はPerlのハッシュからXMLスキーマを構築しますか?
- 11. コマンドラインからのemacsの実行とロックされたファイルの処理
- 12. Python構造体からXMLを構築する
- 13. Pythonから.batファイルに構築されたCLASSPATHを取得します
- 14. マクロの構築と処理のベストプラクティス
- 15. Meteor:#eachでラップされたオブジェクトから生成されたイベントを処理しますか?
- 16. 親クラスから構築された拡張クラス
- 17. ネストされたフォームのhas_manyからcheckboxまでの処理
- 18. XMLファイルから関数宣言を動的に構築できますか?
- 19. phpを使ってmysqlクエリからflash用のxmlファイルを構築します
- 20. Sharepointイベント処理..どの列が変更されましたか?
- 21. 処理されなかったGridViewイベントのPageIndexChanging
- 22. ユーザーの入力からXMLを構築する
- 23. PythonのソケットストリームからXMLドキュメントを構築/解析する
- 24. 与えられたエッジポイントからメッシュを構築するには?
- 25. カスタムビューリゾルバからスローされた例外の処理
- 26. Flickrから解析されたNSDictionaryコンテンツの処理
- 27. wcfサービスコントラクトから返されたxmlにxml-transform処理命令を追加できますか?
- 28. パラメーターhudsonジョブダッシュボードから構築
- 29. 配列から構築
- 30. GtkWidgetからX11ウィンドウハンドルを取得する
GTK(C API)、またはGTKmm(C++バインディング)を使用していますか? – liberforce
私はGTKを使用しています。これはコードです: –
void initGuiWindow() { ビルダー= gtk_builder_new(); gtk_builder_add_from_file(ビルダー、 "assignment1gui.xml"、(GError **)NULL); ウィンドウ= GTK_WIDGET(gtk_builder_get_object(builder、 "window")); gtk_builder_connect_signals(ビルダー、NULL); } –