2016-06-18 17 views
0

に信号を発する:は、私は次のコードの断片を持つウィンドウ

Glib::signal_idle().connect(sigc::mem_fun(*this, &IdleSendEvent::Do)); 

私が達成したいもの:: キャンバスのハンドラ

win = new Gtk::Window; 
m_canvas = new Goocanvas::Canvas; 

sigc::connection conn_t1 = m_canvas->signal_event().connect(sigc::ptr_fun(&AnyEvent)); 

sigc::connection conn_t2 = win->signal_event().connect(sigc::ptr_fun(&WinHandler)); 

今、私はまた、信号を生成IdleHandlerを登録しますイベントを受け取るべきであり、新しいものを生成する必要があります。このオブジェクトは、m_canvas-> signal_event()のハンドラを再び呼び出すように、オブジェクトに送信する必要があります。

つまり、アイドルハンドラ経由で間接的に信号が送信オブジェクト自体に送信されます。

しかし、信号がキャンバスそのものではなく、そこにいくつかの子オブジェクトに受信されない

g_signal_emit_by_name (m_canvas->gobj(), "button-press-event", event, &return_val); 

に私は火の場合。

Q:もう一度キャンバスに送信するには? "get_the_parent_signal_object_handler_father_receiver"や何か奇妙なものがありますか?

私がやったgtk_widget_get_parent_windowたくさんの()しかし、のような実行時エラーですべての結果:

(行き:15430)を:GLibの-GObjectの-WARNING **:gsignal.c:3484:信号名「ボタン - プレス・イベントは、 『タイプの『0x9afbc48」例えば、無効である』GdkX11Window』

私は単純に正しいインスタンスを見つけるために、私は、キャンバスのために受信された信号をemmitする必要がない考えを持っていません。 g_signal_emit_by_nameのインスタンスは、オブジェクト自体ではなく、すべての子インスタンスに対して起動します。私は信号がどのように処理され、どのように階層を歩くことができるかのドキュメンテーションを見つけることができません。問題の1つは、gtk +とgtkmmは関連していますが、ドキュメントは完全に不明瞭で散在しています。

答えて

0

からに特定のオブジェクトを送信することはできません。あなたはからのオブジェクトだけを放射することができ、放射オブジェクトのその信号に接続されているシグナルハンドラによって受信されます。オブジェクトはシグナルを受信せず、シグナルハンドラだけが行います。 (シグナルハンドラは、例えば、オブジェクトのメソッドであってもよいが)

g_signal_emit_by_name()の第1引数は発光オブジェクトでなければならない。

信号ハンドラに信号を受信させるには、上のサンプルコードで行ったように、g_signal_connect(emitter, signal_name, handler, user_data)またはそのC++に相当するsigc::signal::connect()を使用します。

関連する問題