我刚刚从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_())
答案 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}来装饰的具有已定义签名的装饰器。
对于您的情况,请将其视为一种良好做法 - 将方法表示为某些信号的插槽。