2016-06-18 12 views
0

Ich habe die folgenden Code-Fragmente:emittieren Signal Fenster

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

Jetzt auch ich einen IdleHandler registrieren, die Signale erzeugt:

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

Was ich will, erreichen: Der Handler der Leinwand sollte ein Event erhalten und sollte ein neues generieren und dieses an das Objekt senden, damit es den Handler des m_canvas-> signal_event() erneut aufruft.

Mit anderen Worten: Indirekt über den Idle Handler sollte das Signal an das sendende Objekt selbst gesendet werden.

Aber wenn ich Feuer zu

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

wird das Signal in der Leinwand selbst nicht erhalten, aber in einigen Kind dort Objekte.

F: Wie emmit wieder auf die Leinwand? Gibt es etwas wie "get_the_parent_signal_object_handler_father_receiver" oder etwas Seltsames?

ich viel gtk_widget_get_parent_window tat(), aber alle Ergebnisse in Laufzeitfehler wie:

(gehen: 15.430): Glib-GObject-WARNING **: gsignal.c: 3484: Signalname ‚Taste -press-Ereignis‘ist ungültig zum Beispiel‚0x9afbc48‘vom Typ‚GdkX11Window‘

ich habe einfach keine Ahnung, wo die richtige Instanz zu finden, die ich ein Signal an Emmit habe, die für die Leinwand wird dann empfangen. Es sieht so aus, dass die Instanz für g_signal_emit_by_name nicht auf das Objekt selbst, sondern auf alle untergeordneten Instanzen feuert. Ich kann keine Dokumentation finden, wie die Signale verarbeitet werden und wie die Hierarchie durchlaufen werden kann. Eines der Probleme ist, dass gtk + und gtkmm verwandt sind, aber die Dokumentation völlig unklar und verstreut ist.

Antwort

0

Sie können kein Signal an ein bestimmtes Objekt ausgeben. Sie können nur ein Signal von ein Objekt aussenden, das von allen Signalhandlern empfangen wird, die mit diesem Signal des emittierenden Objekts verbunden sind. Objekte empfangen keine Signale, nur Signalhandler tun dies. (Obwohl der Signalhandler zum Beispiel eine Methode eines Objekts sein kann.)

Das erste Argument von g_signal_emit_by_name() muss das emittierende Objekt sein.

Damit ein Signal-Handler ein Signal empfängt, verwenden Sie g_signal_connect(emitter, signal_name, handler, user_data) oder sein C++ -Äquivalent, sigc::signal::connect(), wie im obigen Beispielcode.

Verwandte Themen