3

クラスメソッドを直接呼び出すだけでなく、pyqt シグナル/スロットを使用したい理由を理解しようとしています。

これは、私がそれをどのように見ているかを示すコードの簡単なスニペットです。

from PyQt4 import QtGui, QtCore

class Simple_signal(QtCore.QObject):
    single_signal = QtCore.pyqtSignal()
    double_signal = QtCore.pyqtSignal()

    def __init__(self):
        super().__init__()
        # Connect one signal to one slot
        self.single_signal.connect(self.handle_signal_choice1)

        # Connect another signal to two slots
        self.double_signal.connect(self.handle_signal_choice1)
        self.double_signal.connect(self.handle_signal_choice2)

        # Connect to one method
        self.method = self.handle_signal_choice3

    def handle_signal_choice1(self):   
        print("Simple_signal - CHOICE1 received")

    def handle_signal_choice2(self):
        print("Simple_signal - CHOICE2 received")

    def handle_signal_choice3(self):
        print("Simple_signal - CHOICE3 received")

if __name__ == "__main__":
    simple_signal = Simple_signal()
    print('Calling choice1 via single_signal')
    simple_signal.single_signal.emit()

    print('Calling choice1 and choice2 via double_signal')
    simple_signal.double_signal.emit()

    print('Calling choice3 via class method')
    simple_signal.method()

シグナルの直接的な利点の 1 つは、シグナルを 2 つのスロットに接続するのが非常に簡単であることです。ただし、メソッドの例では大騒ぎせずにそれを行うこともできます。

メソッドの例は、シグナル/スロットの例よりも優れた CPU 時間の結果 (つまり、高速) を取得しているように見えますが、1 つのシグナルから多数のスロットを呼び出す必要がある場合、その利点は失われる可能性があります。

私の考えでは、メソッドを呼び出す方が、シグナル/スロットのセットアップをいじるよりもクリーンです。

どちらも QWidgets で機能します。

メソッドを直接呼び出すよりもシグナル/スロットの方が適している、より複雑な状況が必要ですか?

ありがとう。

編集: 各メソッドで消費される時間が気になるので、いくつかの timeit チェックを行いました。

これらの timeit 行をコードに追加し、元のコード (つまり、handle_signal_choice1) の各「print」行を単に「pass」に置き換えて、シェルへの出力によって処理が遅くならないようにします。

result=timeit.timeit('simple_signal.single_signal.emit()', 'from __main__ import simple_signal', number=10000)
print('Calling choice1 via single_signal')
print('timeit says : ', result)

result=timeit.timeit('simple_signal.double_signal.emit()', 'from __main__ import simple_signal', number=10000)
print('Calling choice1 and choice2 via double_signal')
print('timeit says : ', result)

result=timeit.timeit('simple_signal.method()', 'from __main__ import simple_signal', number=10000)
print('Calling choice3 via method')
print('timeit says : ', result)

これにより、次の結果が得られます。これは、単一のメソッド呼び出しが単一のシグナル/スロットよりも高速であるという私の疑いを裏付けています。

Now start timeit tests
Calling choice1 via single_signal  
timeit says :  0.010595089312688225
Calling choice1 and choice2 via double_signal 
timeit says :  0.014604222516910098
Calling choice3 via method
timeit says :  0.0016033988748859057

メソッドの代わりにシグナル/スロットを介してソケットイベントループを駆動する場合、これは大きな違いです。ボタンのクリックは問題ではありません。

4

1 に答える 1