2012-02-17 9 views
0

XMLファイルから構築されたGTKウィンドウがあるC言語のグラフィックスプログラムを作成しています。このウィンドウにはそれぞれに対応するいくつかのボタンとハンドラがあります(たとえば、ボタンが "円"と表示され、 "on_circle_clicked()"というハンドラがある場合)。これらのボタンがクリックされたときにイベントを処理したい。これはどうすればいいですか?XMLファイルから構築されたgtkwidgetからのイベントの処理

+0

GTK(C API)、またはGTKmm(C++バインディング)を使用していますか? – liberforce

+0

私はGTKを使用しています。これはコードです: –

+0

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); } –

答えて

2

信号処理コードはシグナルハンドラに入ります。あなたの例によると、 "on_circle_clicked"として "clicked"のシグナルハンドラを持つボタン "circle"の場合、ボタンがクリックされると、on_circle_clickedは&と呼ばれ、そのボタンをクリックする処理を行うロジックを持ちます。これを行うには、glade(使用しているXMLファイルの種類を生成する)を使用して、xmlファイルの作成中にウィジェットのシグナルハンドラの名前を追加します。これらのシグナルハンドラは、ソースコードで実装する必要があります。あなたはtheselinksが役に立ちます。ご参考のためにサンプルの下に見つけてください:gtk_builder_connect_signalsのドキュメントで述べたように

  1. :あなたが気をつけなければなりません
    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 to gmodule-export-2.0。 Windowsでは、シグナルハンドラの前にG_MODULE_EXPORTを追加する必要があります。

  2. シグナルハンドラのシンボルが検索されると、は(GCCとの「隠された」として機能するために可視属性を設定例えば)static機能や非表示としての機能を、それをしない

お役に立てれば!

関連する問題