2

私がやりたかったのは、マウスクリックの「clicked」信号とキープレスの「key_press_event」信号を同じコールバック関数に接続することです。コードは次のように始まりました。

static void s_up(GtkWidget *btn,
                 gpointer  data)
{
    code ...
}

...

int main(int argc, char **argv)
{
    ...
    g_signal_connect(button, "clicked", G_CALLBACK(s_up), NULL);
}

マウスクリックをうまく処理しました。次に、キーボードのプレスを追加したいと思いました。だから私はコードを

static void s_up(GtkWidget   *btn,
                 GdkEventKey *event
                 gpointer    data)
{
    if(event->keyval == 's')
        more code ...
}

...

int main(int argc, char **argv)
{
    ...

    g_signal_connect(button, "key_press_event", G_CALLBACK(s_up), NULL);
}

キーボードで「s」を押すと機能しました。

私の質問は、両方のシグナルを同じs_upコールバック関数に接続する方法ですか? の明らかな問題以外に、if(event->keyval == 's')両方を呼び出してみgtk_signal_connectましたが、ボタンをクリックすると、SegFault が を指していましたs_up。「s」を押しても何も起こりませんでした。どんな助けでも大歓迎です。

4

2 に答える 2

4

異なる引数が必要なため、両方のシグナルを同じシグナル ハンドラーに直接接続することはできません。

セグメンテーション違反が発生する理由はevent->keyvalkey-press-event. clickedイベントを受け取ると、2 番目の引数は になります。これは、イベントで提供された引数NULLにマップされ、シグナル ハンドラーをインストールしたときにそれを設定したため、になります。gpointerclickedNULLeventNULL

両方のシグナルを同じハンドラーに接続する理由が、どちらのシグナルがトリガーされても実行する必要がある共通のコードがあるためである場合、解決策は、各シグナルに対して 1 つのハンドラーと、両方の共通コードを持つ 3 つ目の関数を用意することです。それらのどれかを呼び出すことができます。

于 2013-04-14T05:58:42.117 に答える