我有以下代码片段:
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);
信号本身不是在帆布本身中收到的,而是在某些子对象中收到的。
Q:如何再次伸入画布?是否有诸如" get_the_parent_signal_object_handler_father_receiver"之类的东西?
我做了很多gtk_widget_get_parent_window(),但是所有结果都在运行时错误,例如:
(GO:15430):Glib-Gobject-warning **:gsignal.c:3484:信号名称'button-press-event'无效,例如'0x9afbc48'类型'gdkx11window'
我根本不知道在哪里可以找到正确的实例,然后我必须将其删除一个信号,然后收到画布的信号。看来g_signal_emit_by_name
的实例不向对象本身,而是所有子女实例。我找不到文档如何处理信号以及如何通过层次结构进行操作。问题之一是GTK 和GTKMM是相关的,但文档完全不清楚和分散。
您不能发出信号 一个特定对象。您只能从一个对象发出信号,该对象将由连接到发射对象的信号的任何信号处理程序接收。对象没有接收信号,只有信号处理程序。(尽管信号处理程序可能是对象的一种方法。)
g_signal_emit_by_name()
的第一个参数必须是发射对象。
使信号处理程序接收信号,使用g_signal_connect(emitter, signal_name, handler, user_data)
或其C 等效的sigc::signal::connect()
,就像您在上面的示例代码中所做的那样。