嗯,我对Qt很熟悉,但是当使用PyQt时,信号/插槽的语法让我很困惑。当使用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()'))
发布于 2013-07-21 12:08:14
首先,您应该将新型信号与pyqt结合使用。事实上,QObject.connect
和QObject.emit
甚至不再存在在PyQt5中了。
def __init__(self,parent = None):
super(workThread,self).__init__(parent)
self.mWorkDoneSignal = pyqtSignal()
这将创建一个未绑定的信号,并将其分配给实例变量mWorkDoneSignal
,wich并没有真正的效果。如果您想要创建一个信号,那么您确实必须在类中声明它。
因此,如果您没有在这里真正创建一个信号,那么为什么这个调用会成功:
QObject.connect(c,SIGNAL('mWorkDoneSignal()'),d,SLOT('display()'))
答案在于旧信号的处理 by PyQt4:
发出PyQt4信号的行为隐式地定义了它。
因此,当您将信号连接到插槽时,只会检查插槽是否存在。信号本身在这一点上并不真正需要存在,所以除非时隙不存在,否则调用总是成功的。
我试过以下方法,但都失败了。
QObject.connect(c,SIGNAL('mWorkDoneSignal'),d,SLOT('display'))
QObject.connect(c,SIGNAL('mWorkDoneSignal()'),d,SLOT('display()'))
第一个失败是因为display
(没有括号)不是一个有效的插槽。
第二个成功。它不能工作的原因是因为您发出了mWorkDoneSignal
,但实际上需要发出的是:
self.emit(SIGNAL("mWorkDoneSignal()"))
使用新风格的信号,没有办法把这样的事情搞砸:
from utils import sigint
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import time
class workThread(QThread):
mWorkDoneSignal = pyqtSignal()
def __init__(self,parent = None):
super(workThread,self).__init__(parent)
def run(self):
print "workThread start"
time.sleep(1)
print "workThread stop"
self.mWorkDoneSignal.emit()
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()
c.mWorkDoneSignal.connect(d.display)
c.start()
d.show()
app.exec_()
https://stackoverflow.com/questions/17772143
复制相似问题