向窗口发射信号

时间:2016-06-18 15:11:33

标签: gtk3 gtkmm3

我有以下代码片段:

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

1 个答案:

答案 0 :(得分:0)

您无法向特定对象发送信号 。您只能从对象发出信号,该信号将由连接到发射对象的该信号的任何信号处理程序接收。物体不接收信号,只有信号处理器才能接收信号。 (尽管信号处理程序可以是例如对象的方法。)

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

要使信号处理程序接收信号,请使用g_signal_connect(emitter, signal_name, handler, user_data)或其等效的C ++ sigc::signal::connect(),如上面的示例代码所示。