pyqtSlot的功能

时间:2017-08-23 13:58:25

标签: python pyqt pyqt5 qtcore

我刚刚从here阅读了有关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_())

1 个答案:

答案 0 :(得分:1)

button.clicked.connect(self.on_click)将按钮(clicked)的信号绑定到广告位self.on_click。如果没有此绑定,则无法执行任何操作。

反过来,

@pyqtSlot是一个装饰器,它将简单的python方法转换为Qt插槽。 Doc州:

  

虽然PyQt5允许任何Python可调用时用作插槽   连接信号,有时需要明确标记a   Python方法作为Qt槽并为其提供C ++签名   它。 PyQt5提供pyqtSlot()函数装饰器来做到这一点。

     

...

     

将信号连接到装饰的Python方法还具有减少使用的内存量并且稍快一点的优点。

什么时候装饰必要

我知道的唯一情况是你想从QML接口调用方法:你可以将从QObject派生的对象传递给QML并调用对象的方法,但前提是这些方法是用{{1}来装饰的具有已定义签名的装饰器。

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