pyqtSlot的功能

Kes*_*ter 1 python pyqt pyqt5 qtcore

我刚刚从这里阅读了有关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_())
Run Code Online (Sandbox Code Playgroud)

9do*_*ogs 5

button.clicked.connect(self.on_click)将按钮(clicked)的信号绑定到插槽self.on_click。没有此绑定,单击将不会执行任何操作。

@pyqtSlot依次是一个装饰器,可将简单的python方法转换为Qt插槽。Doc指出:

尽管PyQt5允许在连接信号时将任何可调用的Python用作插槽,但有时有必要将Python方法显式标记为Qt插槽并为其提供C ++签名。PyQt5提供了pyqtSlot()函数装饰器来执行此操作。

...

将信号连接到经过修饰的Python方法还具有减少使用的内存量的优点,并且速度稍快

当该装饰必要

我知道的唯一情况是何时要从QML接口调用方法:可以将派生自QObjectQML 的对象传递给QML并调用对象的方法,但前提是这些方法用@pyqtSlot带有定义签名的装饰器修饰。

对于您的情况,将其视为一种好习惯-将方法表示为某些信号的插槽。