栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用.ui表单自动连线时,QPushButton.clicked()会触发两次

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用.ui表单自动连线时,QPushButton.clicked()会触发两次

首先,如果使用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()
    来避免前面的问题,因为除此以外,它还具有快速性和节省资源的优点。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/407447.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号