首先,如果使用Qt的信号插槽自动接线机制,则使用该方法
QmetaObject::connectSlotsByName(),因此,此行为是由于该函数从C
转换为Python所致,对于C ,仅QmetaObject ::
connectSlotsByName()函数连接到插槽,但是在Python中它扩展为调用不是插槽的功能。
问题在于,当您单击时是一个重载信号,在C ++中,它允许您使用默认参数来实现:
void QAbstractButton::clicked(bool checked = false)
但在python中必须使用2个签名:
clicked = QtCore.pyqtSignal([], [bool])
因此,在PyQt与插槽的连接中,它习惯于
QmetaObject::connectSlotsByName()使用通过
QmetaObject来获得签名的对象的
QmetaMethod,但是,如果不是插槽,则无法获取该信息,因此该连接等效于调用。
在
@pyqtSlot()具有以下签名的情况下:
@pyqtSlot()def on_btnSlot_clicked(self): print('slotted function call')由PyQt建立的连接如下:
self.btnSlot.clicked.connect(self.on_btnSlot_clicked)
但是如果的签名
@pyqtSlot(bool)是:
@pyqtSlot(bool)def on_btnSlot_clicked(self, checked): print('slotted function call', checked)由PyQt建立的连接如下:
self.btnSlot.clicked[bool].connect(self.on_btnSlot_clicked)
但是在连接到不是插槽的功能的情况下,由于它使用
QmetaObject,因此不会考虑这些元素,因此它将使用所有可能的签名进行连接。
self.btnSlot.clicked[bool].connect(self.on_btnFunc_clicked)self.btnSlot.clicked.connect(self.on_btnFunc_clicked)
结论:
当
QmetaObject::connectSlotsByName(...)
使用时,如果它连接到@pyqtSlot(...)
的签名进行验证。如果信号连接到非函数,则@pyqtSlot(...)
它们将连接所有可能的签名,因此,如果信号过载了n个签名,则将其称为n次。您必须使用它
@pyqtSlot()
来避免前面的问题,因为除此以外,它还具有快速性和节省资源的优点。



