PyQt 将 SIGNAL 连接到多个 SLOT
Posted
技术标签:
【中文标题】PyQt 将 SIGNAL 连接到多个 SLOT【英文标题】:PyQt connect SIGNAL to multiple SLOT 【发布时间】:2012-05-18 13:37:25 【问题描述】:我正在尝试从rapid gui programming with python and qt
学习PyQt
,目前正在学习Signals
和Slots
。
以下是我的代码的简短 sn-p:
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()
我在这里尝试实现的是在发出ValueChanged(int)
信号后立即调用spinbox.setValue
和getValue_dial
的dial
对象的SLOTS。
上述代码成功执行,没有任何错误,print
更改了相应的值。
现在我的问题是上述方式适合为单个信号调用多个插槽。?
以上两个语句(1 & 2)能否合并成一个语句。
这是我的complete code 的链接。
【问题讨论】:
【参考方案1】:你这样做的方式很好。如果您有很多事情要做,您可以连接到一个为您处理所有事情的新函数。
我注意到在您连接的 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)
但是对于最初的问题和你正在做的两件事,我只是连接信号两次而不是有一个辅助函数。
【讨论】:
谢谢。一个很好的解释 好的,我知道当拨号值发生变化时,这个信号会以新值作为参数发出,但是我们如何能够直接访问该值作为变量value
。我的意思是我们不需要一些dial
对象特定的调用。我们怎么能只通过变量名value
来访问它。
QDial 继承自 QAbstractSlider。在documentation 中,您可以看到valueChanged
在发出时传递了一个int,并且该int 是滑块的值。【参考方案2】:
您可以使用列表在单个语句中连接两个插槽/函数:
# 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]]
【讨论】:
【参考方案3】:这是适当的方式,是的。你can't combine
将两个CONNECT语句合二为一。
【讨论】:
以上是关于PyQt 将 SIGNAL 连接到多个 SLOT的主要内容,如果未能解决你的问题,请参考以下文章