私は Qt に精通していますが、PyQt を使用する場合、signal/slot の構文に非常に戸惑いました。C++/Qt を使用している場合、コンパイラはシグナル/スロットのどこが間違っているかのヒントを提供しますが、PyQt の既定の構成ではエラーに関するヒントは提供されません。PyQtがより多くの情報を表示できるようにするデバッグトリガーモードなどの方法はありますか? コードは次のとおりです。
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import time
class workThread(QThread):
def __init__(self,parent = None):
super(workThread,self).__init__(parent)
self.mWorkDoneSignal = pyqtSignal() ## some people say this should be defined as clas member, however, I defined it as class member and still fails.
def run(self):
print "workThread start"
time.sleep(1)
print "workThread stop"
print self.emit(SIGNAL("mWorkDoneSignal"))
class MainWidget(QWidget):
def __init__(self , parent = None):
super(MainWidget,self).__init__(parent)
@pyqtSlot()
def display(self):
print "dispaly"
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
c = workThread()
d = MainWidget()
##In Qt, when using QObject::connect or such things, the return value will show the
## signal/slot binding is success or failed
print QObject.connect(c,SIGNAL('mWorkDoneSignal()'),d,SLOT('display()'))
c.start()
d.show()
app.exec_()
C++ では、QObject::connect の戻り値は、シグナル/スロット バインディングが成功したかどうかを示します。PyQt では、戻り値は True ですが、スロットをトリガーしません。私の質問: 1) シグナルはクラス メンバーまたはインスタンス メンバーである必要がありますか? 2) QObject.connect の戻り値がバインディングのヒントを与えることができない場合、それを検出する他の方法はありますか? シグナル送信者とスロット受信者の外側にシグナル/スロットをバインドしたいので、 QObject.connect の方法を使用することをお勧めします。しかし、これを正しく書くにはどうすればよいですか。次の方法を試しましたが、どちらも失敗しました。
QObject.connect(c,SIGNAL('mWorkDoneSignal'),d,SLOT('display'))
QObject.connect(c,SIGNAL('mWorkDoneSignal()'),d,SLOT('display()'))