有一些概念需要澄清
【QT信号槽】VS【Python信号槽】
pyqt 提供的所有预定义信号和槽均由 QT 的 c++ 代码实现。每当您想在 Python 中自定义信号和槽时,它就是一个 Python 信号和槽。因此,有四种情况可以向插槽发出信号:
- 从 QT 信号到 QT 槽
- 从 QT 信号到 Python 插槽
- 从 Python 信号到 QT 插槽
- 从 Python 信号到 Python 插槽
下面的代码显示了如何连接这四个不同的 scnarios
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class Foo(QtCore.QObject):
def __init__(self, parent=None):
super(Foo, self).__init__(parent)
dial = QDial()
self.spinbox = QSpinbox()
# --------------------------------------
# QT signal & QT slot
# --------------------------------------
# option 1: more efficient
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),
dial, SLOT("setValue(int)"))
# option 2:
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),
dial.setValue)
# --------------------------------------
# QT signal & Python slot
# --------------------------------------
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),
self.myValChanged)
# --------------------------------------
# Python signal & Qt slot
# --------------------------------------
# connect option 1: more efficient
self.connect(self, SIGNAL("mysignal"), dial,
SLOT("setValue(int)"))
# connect option 2:
self.connect(self, SIGNAL("mysignal"), dial.setValue)
# emit
param = 100
self.emit(SIGNAL("mysignal"), param)
# --------------------------------------
# Python signal & Python slot
# --------------------------------------
# connect
self.connect(self, SIGNAL("mysignal"), self.myValChanged)
# emit
param = 100
self.emit(SIGNAL("mysignal"), param)
def myValChanged(self):
print "New spin val entered {0}".format(self.spinbox.value())
结论是——
Python 信号的信号签名不同于 QT 信号的信号签名,因为它没有括号,并且在您发出它时可以传递任何 Python 数据类型。Python 信号是在您发出它时创建的。
对于 slot,存在三种形式的签名。
- s.connect(w, SIGNAL("signalSignature"), functionName)
- s.connect(w,SIGNAL("signalSignature"), instance.methodName)
- s.connect(w,SIGNAL("signalSignature"), 实例, SLOT("slotSignature"))
1 号和 2 号可用于 Python 插槽,而 2 号和 3 号可用于 QT 插槽。很明显,除了 QT 预定义的槽外,任何 Python 可调用函数/方法都被限定为 Python 槽。
这些观点在Summerfield 关于 Signals and Slots 的文章中提出。
【老款qt信号&槽】VS【新款qt信号&槽】
好吧,上面所有的描述都是基于旧式的pyqt信号槽。正如@Idan K 所建议的那样,有一种替代的新风格来做这些事情,尤其是对于 Python 信号。请参阅此处了解更多信息。