41

@QtCore.Slot デコレーターを使用する PySide スロットのサンプル コードと、使用しないサンプル コードを見てきました。自分でテストしたところ、違いはないようです。使用すべき、または使用すべきでない理由はありますか? たとえば、次のコードでは:

import sys
from PySide import QtCore

# the next line seems to make no difference
@QtCore.Slot()
def a_slot(s):
    print s

class SomeClass(QtCore.QObject):
    happened = QtCore.Signal(str)
    def __init__(self):
        QtCore.QObject.__init__(self)
    def do_signal(self):
        self.happened.emit("Hi.")

sc = SomeClass()
sc.happened.connect(a_slot)
sc.do_signal()

@QtCore.Slot デコレーターは違いはありません。これを省略して @QtCore.Slot(str) を呼び出したり、@QtCore.Slot(int) を呼び出したりしても、「こんにちは」とうまく言います。

同じことが PyQt の pyqtSlot にも当てはまるようです。

4

3 に答える 3

63

このリンクは、pyqtSlotデコレータについて次のことを説明しています。

PyQt4では、シグナルを接続するときに任意のPython呼び出し可能オブジェクトをスロットとして使用できますが、PythonメソッドをQtスロットとして明示的にマークし、C++署名を提供する必要がある場合があります。PyQt4は、これを行うためのpyqtSlot()関数デコレータを提供します。

シグナルを装飾されたPythonメソッドに接続することには、使用されるメモリの量を減らすという利点もあり、わずかに高速です。

pyqtSlotデコレータは、などの追加の引数を取ることができるため、nameさまざまなPythonメソッドが信号のさまざまなシグネチャを処理できるようになります。

スロットデコレータを使用しない場合、信号接続メカニズムは、基になるC ++関数シグネチャからPython関数にマップするために、すべての型変換を手動で実行する必要があります。スロットデコレータを使用する場合、タイプマッピングを明示的にすることができます。

于 2013-01-21T02:13:54.090 に答える
7

マルチスレッド環境では、シグナルが間違ったスレッドに送られる可能性があるため、pyside Slot デコレーターを使用しないことが必須になる場合があります。見る

PySide (Qt/PyQt) の間違ったスレッドでシグナルを受信する派生クラス

https://bugreports.qt.io/browse/PYSIDE-249

于 2015-12-15T17:47:01.403 に答える