我有以下代码片段:
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() 的处理程序。
换句话说:信号应该通过 Idle Handler 间接发送到发送对象本身。
但如果我开火
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:信号名称'button-press-event'无效,例如'GdkX11Window'类型的'0x9afbc48'
我根本不知道在哪里可以找到正确的实例,我必须发出一个信号,然后接收到画布。看起来 for 的实例g_signal_emit_by_name
不是针对对象本身而是针对所有子实例触发的。我找不到如何处理信号以及如何遍历层次结构的文档。问题之一是 gtk+ 和 gtkmm 是相关的,但文档完全不清楚和分散。