0

我有以下代码片段:

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 是相关的,但文档完全不清楚和分散。

4

1 回答 1

1

您不能特定对象发出信号。您只能一个对象发出一个信号,该信号将由连接到该发射对象的该信号的任何信号处理程序接收。对象不接收信号,只有信号处理程序接收。(尽管信号处理程序可能是,例如,一个对象的方法。)

的第一个参数g_signal_emit_by_name()必须是发射对象。

要使信号处理程序接收信号,请使用g_signal_connect(emitter, signal_name, handler, user_data)或它的 C++ 等效项,sigc::signal::connect()就像您在上面的示例代码中所做的那样。

于 2016-07-04T05:44:13.650 回答