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,目前正在学习SignalsSlots

以下是我的代码的简短 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.setValuegetValue_dialdial 对象的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的主要内容,如果未能解决你的问题,请参考以下文章

Qt5:串口signal-slots机制信号连接错槽

PyQt - 如何将多个信号连接到同一个小部件

为啥可以连接到未声明为 Q_SLOTS 的函数?

PyQt 连接中的参数

如何将 PyQt 插槽从后台线程连接到 gui 线程

从 QML 到 Python Signal/Slots 的数据