我有以下代码片段:
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:
Glib::signal_idle().connect( sigc::mem_fun( *this, &IdleSendEvent::Do));
我想要实现的目标: 画布的处理程序应该接收一个事件,并且应该生成一个新的事件,并且应该发送给该对象,以便它再次调用m_canvas-> signal_event()的处理程序。
换句话说:间接通过空闲处理程序,信号应该发送到发送对象本身。
但如果我开火
g_signal_emit_by_name (m_canvas->gobj(), "button-press-event", event, &return_val);
画布本身没有接收到信号,但是在那里有一些子对象。
问:如何再次向画布发声?是否有" get_the_parent_signal_object_handler_father_receiver"或者奇怪的事情?我做了很多gtk_widget_get_parent_window(),但都导致了运行时错误,如:
(go:15430):GLib-GObject-WARNING **:gsignal.c:3484:信号名称'按钮按下事件'例如' 0x9afbc48'无效类型' GdkX11Window'
我根本不知道在哪里找到正确的实例,我必须发出一个信号然后接收到画布。它看起来g_signal_emit_by_name
的实例不会触发对象本身,而是触发所有子实例。我找不到文档如何处理信号以及如何遍历层次结构。其中一个问题是gtk +和gtkmm是相关的,但文档完全不清楚和分散。
答案 0 :(得分:0)
您无法向特定对象发送信号 。您只能从对象发出信号,该信号将由连接到发射对象的该信号的任何信号处理程序接收。物体不接收信号,只有信号处理器才能接收信号。 (尽管信号处理程序可以是例如对象的方法。)
g_signal_emit_by_name()
的第一个参数必须是发射对象。
要使信号处理程序接收信号,请使用g_signal_connect(emitter, signal_name, handler, user_data)
或其等效的C ++ sigc::signal::connect()
,如上面的示例代码所示。