2016-10-30 16 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負荷またはメモリ使用量に大きな影響を与える前に、,をemits/connectionsにする必要があります。しかし、私はそれがPyQt` `のは事実だと思います。また

+0

、(少なくともPySide''で:これらのポイントの深さ分析でのために、@Scholliiすることにより、このコードプロジェクトの資料を参照してください。スレッド間で信号データを送信する場合は、スロットデコレータを使用する必要があります。 @BrendanAbel。 –

+0

PySideまたはPyQtのクロススレッド信号には必要ありません。唯一の例外は、オブジェクトが別のスレッドに移動する前に信号が接続されている場合ですが、PyQtにのみ影響します。これは上記の私の答えで述べたシナリオです(より完全な説明は[[他の回答](http://stackoverflow.com/a/20818401/984421)参照)。 – ekhumoro

関連する問題