9

我正在尝试学习PyQtrapid 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后立即调用 SLOTSspinbox.setValue和对象。getValue_dialdialValueChanged(int)

上面的代码成功执行,没有任何错误,并且print更改了适当的值。

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

可以将上述两个语句(1 和 2)组合成一个语句。

这是我的完整代码的链接。

4

3 回答 3

14

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

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

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

此外,这取决于偏好,有一种新的信号和插槽样式可以使代码更易于阅读。它会改变

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)

但是对于最初的问题和你正在做的两件事,我只是连接信号两次而不是有一个辅助函数。

于 2012-05-18T13:56:09.507 回答
6

您可以使用列表在单个语句中连接两个插槽/功能:

# 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]]
于 2012-05-18T17:29:23.403 回答
1

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

于 2012-05-18T13:42:52.060 回答