2016-10-30 70 views
3

我使用pyqt5,我已經使用類似於下面的代碼連接的幾種方法:爲什麼我需要用pyqtSlot修飾連接的插槽?

self.progress.canceled.connect(self.cancel) 

其中,例如,self.cancel是:

def cancel(self): 
    self.timer.stop() 

此代碼似乎在清潔工作多種場景,無需裝飾cancelpyqtSlot或做任何特殊的事情。

我的問題是:

  1. 什麼我通過做這種方式失去?
  2. 是什麼原因pyqtSlot是必填項?

回答

6

pyqtSlot的主要目的是允許定義一個槽的幾個不同的過載,每個都有不同的簽名。有時在進行交叉線程連接時可能還需要它(有關這種情況,請參閱this answer)。但是,這些用例相對較少,在大多數PyQt應用程序中根本不需要使用pyqtSlot。信號可以連接到任何可調用的python對象,不管它是否作爲插槽進行裝飾。

PyQt的文檔也狀態:

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

但是,在實踐中,這種優勢通常非常小,並且通常會被其他因素淹沒。它對原始信號傳輸速度的影響很小,並且在開始對CPU負載或內存使用量產生重大影響之前,有必要使其發出/連接數量爲千個。對於這些點的深入分析,請參閱本@Schollii代碼項目文章:

+0

另外,(至少在'PySide';不過,我認爲這是PyQt'的'真如果你想通過線程發送信號數據,你必須使用slot裝飾器。 –

+0

@BrendanAbel。 PySide或PyQt中不需要交叉線程信號。唯一的例外是,如果在將對象移動到另一個線程之前連接了一個信號,但隻影響PyQt。這是我在上面的答案中提到的場景(有關更完整的解釋,請參閱[其他答案](http://stackoverflow.com/a/20818401/984421))。 – ekhumoro

相關問題