2017-08-23 330 views
0

我剛剛從here閱讀了關於pyqt5按鈕的教程。代碼如下。有一個關於button.clicked.connect(self.on_click)@pyqtSlot()的問題。如果我從代碼中刪除@pyqtSlot(),它仍然有效。但是,如果我從代碼中刪除button.clicked.connect(self.on_click),該按鈕不起作用。那麼這個代碼中的@pyqtSlot()的功能是什麼?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_()) 
+2

請參閱[這裏](http://pyqt.sourceforge.net/Docs/PyQt5/signals_slots.html#the-pyqtslot-decorator) – user3419537

回答

0

button.clicked.connect(self.on_click)結合的按鈕(clicked)的信號,以一個時隙self.on_click。沒有這個綁定,點擊將不會導致任何操作。

@pyqtSlot反過來,它是一個將簡單的python方法轉換爲Qt插槽的裝飾器。 Doc狀態:

雖然PyQt5允許任何的Python可調用被用作一個時隙時 連接信號,有時需要顯式標記一個 Python的方法作爲一個Qt槽,並提供一個C++簽名爲 吧。 PyQt5提供了pyqtSlot()函數裝飾器來完成這個任務。

...

連接信號到裝飾的Python方法還具有減少的存儲器使用量的優點,並且是稍快

什麼時候裝修必要

我知道的唯一情況是,當你想從QML接口調用方法時:你可以將一個從QObject派生的對象傳遞給QML,並調用對象的方法,但前提是這些方法用裝飾器裝飾並且具有定義的簽名。

對於您的情況,將其視爲一種良好做法 - 將某種方法表示爲某種信號的插槽。