请注意该行redb.clicked[bool].connect(self.setColor),为什么要添加该部分[bool]?我试图删除部分,修改行redb.clicked.connect(self.setColor),结果是一样的.那是什么?
import sys
from PyQt4 import QtGui
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
self.col = QtGui.QColor(0, 0, 0)
redb = QtGui.QPushButton('Red', self)
redb.setCheckable(True)
redb.clicked[bool].connect(self.setColor)
self.square = QtGui.QFrame(self)
self.square.setGeometry(150, 20, 100, 100)
self.square.setStyleSheet("QWidget { background-color: %s }" %
self.col.name())
self.show()
def setColor(self, pressed):
if pressed:
val = 255
else: val = 0
self.col.setRed(v)
self.square.setStyleSheet("QFrame { background-color: %s }" %
self.col.name())
def main():
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
在PyQt中,您可以使用其签名对信号进行索引,以选择正确的过载.(你读的是正确的:一个可以使Qt信号过载并提供具有完全不同参数的不同版本的信号).这得到C++的良好支持,但Python不直接支持重载,因此这种索引机制.
如果信号没有超载,则不需要执行此操作,使用签名进行索引与根本没有索引具有相同的效果.
例:
import sys
from PyQt4.QtGui import *
app = QApplication(sys.argv)
def valueChanged(eitherIntOrString):
print(eitherIntOrString, type(eitherIntOrString))
spinbox = QSpinBox()
spinbox.valueChanged[str].connect(valueChanged)
spinbox.valueChanged[int].connect(valueChanged)
spinbox.valueChanged.connect(valueChanged)
spinbox.show()
app.exec_()
Run Code Online (Sandbox Code Playgroud)
样本输出:
1 <class 'str'>
1 <class 'int'>
1 <class 'int'>
2 <class 'str'>
2 <class 'int'>
2 <class 'int'>
3 <class 'str'>
3 <class 'int'>
3 <class 'int'>
Run Code Online (Sandbox Code Playgroud)
现在你理所当然地问PyQt如何选择默认的重载?(connect()示例中的第三个).答案是:他们在PyQt文档中记录了这一点.C++ Qt文档和PyQt文档之间的少数差异之一.例如:http://pyqt.sourceforge.net/Docs/PyQt4/qspinbox.html#valueChanged.在我看来,默认信号始终是在C++标头中首先声明的信号,但情况可能并非总是如此.
信号可能过载,即.具有特定名称的信号可能支持多个签名.可以用签名索引信号以便选择所需的信号.签名是一系列类型.类型是Python类型对象或C++类型名称的字符串.C++类型的名称会自动标准化,例如,可以使用QString代替非规范化的const QString&.
资料来源:http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html