29

GObjectリファレンスによると

g_signal_connect_swapped(instance、detailed_signal、c_handler、data); GCallback関数を特定のオブジェクトのシグナルに接続します。ハンドラーを呼び出すときに、シグナルが発行され、データが交換されるインスタンス。

これが何を意味するのかよくわかりません。dataこれは、が指しているオブジェクトを指し、が指しているオブジェクトを指すことをinstance意味instanceしますか、dataそれとも私はここで間違いを犯していますか?

前者の場合、この背後にある論理は何ですか?

4

1 に答える 1

45

あなたは正しく理解しています。

これにより、次のようなトリックを実行できます。ボタン(と呼びましょう)があり、押されたときにbutton別のウィジェット(呼びましょう)を非表示にすることになっています。textview

その後、行うことができます

g_signal_connect_swapped(button, 'clicked', G_CALLBACK(gtk_widget_hide), textview);

それを達成するために。ボタンが押されると、「クリックされた」シグナルが生成され、コールバックがtextview最初の引数として、およびbutton2番目の引数として呼び出されます。この場合、コールバックはgtk_widget_hide()1つの引数のみを取るため、2番目の引数は無視されます。これは、C呼び出し規約が機能する方法だからです。

以下と同じですが、短いです。

static void
on_button_clicked(GtkButton *button, GtkWidget *textview)
{
    gtk_widget_hide(textview);
}

...elsewhere...

    g_signal_connect(button, 'clicked', G_CALLBACK(on_button_clicked), textview);

基本的に、インターフェイスを手動でコーディングする場合に余分な関数を作成する必要がなくなります。もちろん、私が理解したことのない、はるかに実用的な使用法があるかもしれません。

于 2010-01-31T23:37:02.927 に答える