クラスメソッドを直接呼び出すだけでなく、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
メソッドの代わりにシグナル/スロットを介してソケットイベントループを駆動する場合、これは大きな違いです。ボタンのクリックは問題ではありません。