pyq函数

2024-05-03 12:14:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚从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_())

Tags: 代码fromimportselfondefconnectsys
1条回答
网友
1楼 · 发布于 2024-05-03 12:14:53

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

@pyqtSlot是一个decorator,它将简单的python方法转换为Qt槽。Doc状态:

Although PyQt5 allows any Python callable to be used as a slot when connecting signals, it is sometimes necessary to explicitly mark a Python method as being a Qt slot and to provide a C++ signature for it. PyQt5 provides the pyqtSlot() function decorator to do this.

...

Connecting a signal to a decorated Python method also has the advantage of reducing the amount of memory used and is slightly faster.

什么时候装修是必要的?

我知道的唯一一种情况是,当您想从QML接口调用方法时:您可以将从QObject派生的对象传递给QML并调用对象的方法,但前提是这些方法使用具有定义签名的@pyqtSlot装饰器进行装饰。

对于您的情况,请将其视为一个良好的实践-将方法表示为某个信号的时隙。

相关问题 更多 >