自定义信号不传播

Custom signal not propagating

对于我从事的项目,我正在使用自定义信号,这些信号在子级上发出,然后在信号未完全处理时传播给它的父级。

根据我发现的信息,似乎没有连接处理程序(使用 connect)或在回调中返回 False 应该允许信号传播到小部件父级。

然而在我下面的玩具示例中,这不起作用:

class MyWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)

        GObject.signal_new("print-this", GObject.TYPE_OBJECT, GObject.SIGNAL_RUN_LAST, GObject.TYPE_BOOLEAN, [GObject.TYPE_STRING])

        self.button = Gtk.Button.new_with_label("Emit signals")
        self.button.connect("clicked", self.emit_signals)

        self.frame = Gtk.Frame.new("Some frame")
        self.frame.add(self.button)
        self.add(self.frame)

        self.connect("print-this", self.got_it)
        self.show_all()
        Gtk.main()

    def got_it(self, widget, string):
        print string
        return False

    def emit_signals(self, *args):
        print "Emitting signals.."
        self.button.emit("print-this", "I was emitted from the button")
        time.sleep(1)
        self.frame.emit("print-this", "I was emitted from the frame")
        time.sleep(1)
        self.emit("print-this", "I was emitted from the window")

当信号发出时,我希望所有三个发射器都打印出来,但我只得到 window 上发射器的打印件。这可能是由于信号根本没有传播造成的。

那么我哪里错了?更重要的是,我怎样才能实现我正在寻找的传播行为?

通用 GObject 信号不通过 GTK 小部件树传播。只有与事件相关的信号才会这样做,而且是在内部完成的 inside GTK.

如果您希望递归地发出信号,您必须添加一个函数来调用树中每个小部件的 g_signal_emit()