pyqtSlot的功能是什么?

17
我刚刚从这里阅读了有关pyqt5按钮的教程,并且代码如下。在代码中有一个关于button.clicked.connect(self.on_click)@pyqtSlot()的问题。 如果我从代码中删除@pyqtSlot(),它仍然有效。 但是,如果我从代码中删除button.clicked.connect(self.on_click),则按钮无法工作。 那么在此代码中@pyqtSlot()的功能是什么?
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot

class App(QWidget):

    def __init__(self):
        super().__init__()
        self.title = 'PyQt5 button - pythonspot.com'
        self.left = 10
        self.top = 10
        self.width = 320
        self.height = 200
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        button = QPushButton('PyQt5 button', self)
        button.setToolTip('This is an example button')
        button.move(100,70) 
        button.clicked.connect(self.on_click)

        self.show()

    @pyqtSlot()
    def on_click(self):
        print('PyQt5 button click')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

2
请点击此处查看。 - user3419537
1个回答

33

button.clicked.connect(self.on_click)将按钮的信号(clicked)绑定到槽函数self.on_click。如果没有这个绑定,点击按钮将不会有任何操作。

@pyqtSlot是一个装饰器,它将简单的Python方法转换为Qt槽函数。文档中指出:

虽然PyQt5允许将任何Python可调用对象用作连接信号时的槽函数,但有时需要明确地将Python方法标记为Qt槽函数并为其提供C++签名。PyQt5提供了pyqtSlot()函数装饰器来完成这个任务。

...

将信号连接到修饰过的Python方法还具有减少内存使用量和稍微加快速度的优点。

什么情况下必须使用这种装饰器?

我知道的唯一情况是当您想从QML界面调用方法时:您可以将派生自QObject的对象传递给QML并调用该对象的方法,但前提是这些方法必须使用定义好签名的@pyqtSlot装饰器修饰。

对于您的情况,将其视为良好的实践-将方法标记为某个信号的槽函数。


如果您使用QMetaObject.invokeMethod和QuededConnection,那么该方法必须为Qt元对象系统所知。因此,在这种情况下,我认为@pyqtSlot也是必需的。(虽然可能有其他方法来标记一个方法为Qt元对象系统。) - jdg
本文研究了“稍微快一点”是什么意思,并得出结论:在生成大量QObjects时使用@pyqtSlot,可以在这种情况下实现实质性的内存节省。 - eMPee584

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接