web-dev-qa-db-ja.com

PySideスロットデコレータは必要ですか?

@ 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にも当てはまるようです。

36
JasonFruit

This リンクは、pyqtSlotデコレータについて次のように説明しています。

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

そして

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

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

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

55
Austin Phillips

オースティンには良い答えがあり、これから書く答えはあなたの質問の範囲から少し外れていますが、それは私を混乱させているものであり、他の人が同じことを疑問に思ってこのページにたどり着くと思います。

PythonメソッドをJavaScriptに公開する(QTWebKitを使用)の場合、@pyqtSlotデコレータは必須です。装飾されていないメソッドはJavaScriptに公開されません。

9
Mark E. Haase

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

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

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

6
Rudolf Cardinal