2016-11-18 6 views
0

この質問は長い間悩まされています。私はまだ初心者ですが、私はGoogleを見て、まだ答えを見つけることができませんでした。私は手がかりを見つけただけで、実装方法はわかりませんでした。コールバック関数から別のウィンドウのウィジェットのポインタを取得する方法 - GTK - C

トップレベルのウィンドウが2つ開いているとします。それらのうちの1つのボタンをクリックすると、他のウィンドウを破壊することができます。

Void on_button1_clicked (GtkWidget *widget, gpointer user_data) 
    { 
     GtkWidget *window2; 

     window2 = lookup_widget (widget, "window2"); 
     gtk_widget_destory (window2); 
    } 

まあ、それは動作しませんでした:

これが私の最初の非機能的溶液でした。 "lookup_widget"関数は、 "button1"が含まれているウィンドウに関連付けられているツリー階層の外を見ていないことを理解しました。 "widget"は "button1"を参照しています。 だから、私は "window1"のポインタを取得し、その代わりに、window1が高い階層の中にあると思うと思った。

GtkWidget *window1; 
    GtkWidget *window2; 
    window1 = lookup_widget (widget, "window1"); 
    window2 = lookup_widget (window1, "window2"); 
    gtk_widget_destroy (window2); 

私の驚きにも、うまくいきませんでした。これは、シグナルイベントが起動された場所の外にウィジェットのポインタを見つけることができないので、他のウィンドウのラベルを変更することについても言えます。

みんな、助けが必要だ!

+0

'lookup_widget()'は何ですか? – andlabs

+0

@andlabsそれはあなたがsupport.cで見つけることができるgtk関数です これは2つのパラメータを与えられたウィジェットのポインタ値を返します。最初のものは、あなたが探しているウィジェットの同じツリーの中のウィジェットへのポインタです。 2番目のパラメータは、見つかるウィジェットの名前を含む文字列です。 – Elyes

+0

あなたはどんなsupport.cを参照していますか? – andlabs

答えて

1

完全なコードがないと正しく答えることができません。しかし、あなたが提供した情報で、私のアプローチは、user_dataを使用して、コールバックで破棄するウィンドウの参照を保持することです。そのよう

:次に

GtkWidget *window2; 
// Get the reference of your window here 
button = gtk_button_new_with_label("Window destroy button"); 
g_signal_connect (button, "clicked", G_CALLBACK (on_button1_clicked), window2); 

、あなたのコールバックは次のようになります。

void on_button1_clicked (GtkWidget *widget, gpointer user_data) 
{ 
    GtkWidget *window2; 

    window2 = (GtkWidget*)user_data; 
    gtk_widget_destory (window2); 
} 
+0

ありがとう!それは私が探していたパズルの一部です。私はそれをテストし、それは働いた。 – Elyes

関連する問題