问题
I have some custom signals in my main thread that I would like to emit in my other threads but I'm not sure how to connect them. Could someone post an example?
ex:
import sys, time
from PyQt4 import QtGui as qt
from PyQt4 import QtCore as qtcore
app = qt.QApplication(sys.argv)
class widget(qt.QWidget):
signal = qtcore.pyqtSignal(str)
def __init__(self, parent=None):
qt.QWidget.__init__(self)
self.signal.connect(self.testfunc)
def appinit(self):
thread = worker()
thread.start()
def testfunc(self, sigstr):
print sigstr
class worker(qtcore.QThread):
def __init__(self):
qtcore.QThread.__init__(self, parent=app)
def run(self):
time.sleep(5)
print "in thread"
self.emit(qtcore.SIGNAL("signal"),"hi from thread")
def main():
w = widget()
w.show()
qtcore.QTimer.singleShot(0, w.appinit)
sys.exit(app.exec_())
main()
signal never raised.
回答1:
You actually connect the wrong signal to the slot. Some modification make it run as expected
import sys, time
from PyQt4 import QtGui as qt
from PyQt4 import QtCore as qtcore
app = qt.QApplication(sys.argv)
class widget(qt.QWidget):
def __init__(self, parent=None):
qt.QWidget.__init__(self)
def appinit(self):
thread = worker()
self.connect(thread, thread.signal, self.testfunc)
thread.start()
def testfunc(self, sigstr):
print sigstr
class worker(qtcore.QThread):
def __init__(self):
qtcore.QThread.__init__(self, parent=app)
self.signal = qtcore.SIGNAL("signal")
def run(self):
time.sleep(5)
print "in thread"
self.emit(self.signal, "hi from thread")
def main():
w = widget()
w.show()
qtcore.QTimer.singleShot(0, w.appinit)
sys.exit(app.exec_())
main()
来源:https://stackoverflow.com/questions/9614947/pyqt4-emiting-signals-in-threads-to-slots-in-main-thread