PyQt将SIGNAL连接到多个SLOT

时间:2012-05-18 13:37:26

标签: python qt pyqt4

我正在尝试从PyQt学习rapid gui programming with python and qt,目前正在学习SignalsSlots

以下是我的代码的简短摘录:

self.connect(self.dial, SIGNAL("valueChanged(int)"),self.spinbox.setValue) #1
self.connect(self.dial, SIGNAL("valueChanged(int)"),self.getValue_dial)    #2
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),self.dial.setValue)
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),self.getValue_spinbox)

def getValue_dial(self):
        print self.dial.value()

def getValue_spinbox(self):
        print self.dial.value()

我在这里尝试实现的是2一次spinbox.setValue SLOTS getValue_dialdial ValueChanged(int)对象print信号射出。

上述代码成功执行,没有任何错误,{{1}}更改了相应的值。

现在我的问题是以上适合为单个信号调用多个插槽的方法。?

上述两个陈述(1& 2)可以合并为一个陈述。

以下是我complete code的链接。

3 个答案:

答案 0 :(得分:10)

你这样做的方式很好。如果你有很多事情要做,你可以连接到一个新功能,为你处理一切。

我注意到你在连接的getValue函数中直接从对象获得了值;您是否知道该值是作为valueChanged(int)信号的参数传递的?如果更改getValue函数以接受其他参数,则无需直接从对象获取值。当然,您可以一起取消getValue函数,并在辅助函数中发出print语句。

self.connect(self.dial, SIGNAL("valueChanged(int)"), self.dial_value_changed)
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),self.spinbox_value_changed)

def dial_value_changed(self, value):
    self.spinbox.setValue(value)
    self.getValue_dial(value)

def spinbox_value_changed(self, value):
    self.dial.setValue(value)
    self.getValue_spinbox(value)

def getValue_dial(self, value):
        print value

def getValue_spinbox(self, value):
        print value

此外,这取决于首选项,有new style for signals and slots可以使代码更容易阅读。它会改变

self.connect(self.dial, SIGNAL("valueChanged(int)"), self.dial_value_changed)
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),self.spinbox_value_changed)

上面的行

self.dial.valueChanged.connect(self.dial_value_changed)
self.spinbox.valueChanged.connect(self.spinbox_value_changed)

但是对于原始问题以及你正在做的两件事我只是将信号连接两次而不是辅助函数。

答案 1 :(得分:4)

您可以使用列表在一个语句中连接两个插槽/函数:

# in Python 2.X
map(self.dial.valueChanged.connect, [self.spinbox.setValue, self.getValue_dial])

# in Python 3.X (map returns an iterator instead of processing the list)
list(map(self.dial.valueChanged.connect, [self.spinbox.setValue, self.getValue_dial]))

# or with any Python version
[self.dial.valueChanged.connect(x) for x in [self.spinbox.setValue, self.getValue_dial]]

答案 2 :(得分:1)

这是合适的方式,是的。您将两个CONNECT语句can't combine合并为一个。