自定义信号不传播
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()
。
对于我从事的项目,我正在使用自定义信号,这些信号在子级上发出,然后在信号未完全处理时传播给它的父级。
根据我发现的信息,似乎没有连接处理程序(使用 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()
。