我刚刚阅读了有关 pyqt5 按钮的教程here https://pythonspot.com/en/pyqt5-buttons/。代码如下。有一个问题是关于button.clicked.connect(self.on_click)
and @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_())
button.clicked.connect(self.on_click)
绑定按钮的信号(clicked
) 到一个槽self.on_click
。如果没有此绑定,单击将不会产生任何操作。
@pyqtSlot
反过来,是一个装饰器,它将简单的 python 方法转换为 Qt 插槽。Doc http://pyqt.sourceforge.net/Docs/PyQt5/signals_slots.html#the-pyqtslot-decorator states:
尽管 PyQt5 允许任何 Python 可调用对象在以下情况下用作插槽:
连接信号,有时是必要的明确标记
Python 方法作为 Qt 槽并提供 C++ 签名
它。 PyQt5 提供了 pyqtSlot() 函数装饰器来执行此操作。
...
将信号连接到修饰的 Python 方法还有以下优点:减少内存使用量并且速度稍快.
什么时候装修的必要的?
我知道的唯一情况是当你想从 QML 接口调用方法时:你可以传递一个派生的对象QObject
到 QML 并调用对象的方法,但前提是这些方法用@pyqtSlot
具有定义签名的装饰器。
对于您的情况,请将其视为一种很好的做法 - 将方法表示为某些信号的槽。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)