PyQt QThreads 通信
PyQt QThreads Communication
PyQt 应用程序有一个 QThread
运行 SenderWorker
,它每秒连续发出一个信号 temperatures
。第二个 QThread
运行 ReceiverWorker
是接收这个发出的信号并将其打印到屏幕上。
问题: 然而 ReceiverWorker
没有响应发出的信号。也许使用以下代码行将它们连接在一起不起作用?
self.receiverWorker.connectSlots(self.senderWorker)
完整代码如下:
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import time
class Screen(QMainWindow):
def __init__(self):
super(Screen, self).__init__()
self.initUI()
def initUI(self):
self.lightsBtn = QPushButton('Turn On')
self.lightsBtn.setCheckable(True)
self.lightsBtn.setStyleSheet("QPushButton:checked {color: white; background-color: green;}")
self.lightsBtn.clicked.connect(self.startLightsThread)
self.setCentralWidget(self.lightsBtn)
def startLightsThread(self):
print 'start lightsThread'
self.senderThread = QThread()
self.senderWorker = SenderWorker()
self.senderWorker.moveToThread(self.senderThread)
self.senderThread.started.connect(self.senderWorker.work)
self.senderThread.start()
self.receiverThread = QThread()
self.receiverWorker = ReceiverWorker()
self.receiverWorker.connectSlots(self.senderWorker)
self.receiverWorker.moveToThread(self.receiverThread)
self.receiverThread.start()
class SenderWorker(QObject):
temperatures = pyqtSignal(object)
def __init__(self):
QObject.__init__(self)
self._mutex = QMutex()
self._running = True
@pyqtSlot()
def work(self):
while self._running:
print 'Sender working'
self.temperatures.emit('123')
time.sleep(1)
class ReceiverWorker(QObject):
def __init__(self):
QObject.__init__(self)
self._mutex = QMutex()
self._running = True
def connectSlots(self, sender):
self.connect(sender, SIGNAL('temperatures'), self.work(temperatures))
def work(self, temperatures):
print 'Receiver working: ', temperatures
app = QApplication(sys.argv)
window = Screen()
window.show()
sys.exit(app.exec_())
更新#1
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import time
class Screen(QMainWindow):
def __init__(self):
super(Screen, self).__init__()
self.initUI()
def initUI(self):
self.lightsBtn = QPushButton('Turn On')
self.lightsBtn.setCheckable(True)
self.lightsBtn.setStyleSheet("QPushButton:checked {color: white; background-color: green;}")
self.lightsBtn.clicked.connect(self.startLightsThread)
self.setCentralWidget(self.lightsBtn)
def startLightsThread(self):
print 'start lightsThread'
self.senderThread = QThread()
self.senderWorker = SenderWorker()
self.senderWorker.moveToThread(self.senderThread)
self.senderThread.started.connect(self.senderWorker.work)
self.senderThread.start()
self.receiverThread = QThread()
self.receiverWorker = ReceiverWorker()
self.receiverWorker.connectSlots(self.senderWorker)
self.receiverWorker.moveToThread(self.receiverThread)
self.receiverThread.start()
class SenderWorker(QObject):
temperatures = pyqtSignal(object)
def __init__(self):
QObject.__init__(self)
self._mutex = QMutex()
self._running = True
@pyqtSlot()
def work(self):
while self._running:
print 'Sender working'
self.temperatures.emit('123')
time.sleep(1)
class ReceiverWorker(QObject):
def __init__(self):
QObject.__init__(self)
self._mutex = QMutex()
self._running = True
def connectSlots(self, sender):
sender.temperatures.connect(self.work)
def work(self, temperatures):
print 'Receiver working: ', temperatures
app = QApplication(sys.argv)
window = Screen()
window.show()
sys.exit(app.exec_())
问题出在连接上,如果您想使用旧样式,则必须输入以下语法:
def connectSlots(self, sender):
self.connect(sender, SIGNAL('temperatures(PyQt_PyObject)'), self.work)
在new style中就简单多了({sender}.{signal}.connect({slot})
):
def connectSlots(self, sender):
sender.temperatures.connect(self.work)
PyQt 应用程序有一个 QThread
运行 SenderWorker
,它每秒连续发出一个信号 temperatures
。第二个 QThread
运行 ReceiverWorker
是接收这个发出的信号并将其打印到屏幕上。
问题: 然而 ReceiverWorker
没有响应发出的信号。也许使用以下代码行将它们连接在一起不起作用?
self.receiverWorker.connectSlots(self.senderWorker)
完整代码如下:
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import time
class Screen(QMainWindow):
def __init__(self):
super(Screen, self).__init__()
self.initUI()
def initUI(self):
self.lightsBtn = QPushButton('Turn On')
self.lightsBtn.setCheckable(True)
self.lightsBtn.setStyleSheet("QPushButton:checked {color: white; background-color: green;}")
self.lightsBtn.clicked.connect(self.startLightsThread)
self.setCentralWidget(self.lightsBtn)
def startLightsThread(self):
print 'start lightsThread'
self.senderThread = QThread()
self.senderWorker = SenderWorker()
self.senderWorker.moveToThread(self.senderThread)
self.senderThread.started.connect(self.senderWorker.work)
self.senderThread.start()
self.receiverThread = QThread()
self.receiverWorker = ReceiverWorker()
self.receiverWorker.connectSlots(self.senderWorker)
self.receiverWorker.moveToThread(self.receiverThread)
self.receiverThread.start()
class SenderWorker(QObject):
temperatures = pyqtSignal(object)
def __init__(self):
QObject.__init__(self)
self._mutex = QMutex()
self._running = True
@pyqtSlot()
def work(self):
while self._running:
print 'Sender working'
self.temperatures.emit('123')
time.sleep(1)
class ReceiverWorker(QObject):
def __init__(self):
QObject.__init__(self)
self._mutex = QMutex()
self._running = True
def connectSlots(self, sender):
self.connect(sender, SIGNAL('temperatures'), self.work(temperatures))
def work(self, temperatures):
print 'Receiver working: ', temperatures
app = QApplication(sys.argv)
window = Screen()
window.show()
sys.exit(app.exec_())
更新#1
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import time
class Screen(QMainWindow):
def __init__(self):
super(Screen, self).__init__()
self.initUI()
def initUI(self):
self.lightsBtn = QPushButton('Turn On')
self.lightsBtn.setCheckable(True)
self.lightsBtn.setStyleSheet("QPushButton:checked {color: white; background-color: green;}")
self.lightsBtn.clicked.connect(self.startLightsThread)
self.setCentralWidget(self.lightsBtn)
def startLightsThread(self):
print 'start lightsThread'
self.senderThread = QThread()
self.senderWorker = SenderWorker()
self.senderWorker.moveToThread(self.senderThread)
self.senderThread.started.connect(self.senderWorker.work)
self.senderThread.start()
self.receiverThread = QThread()
self.receiverWorker = ReceiverWorker()
self.receiverWorker.connectSlots(self.senderWorker)
self.receiverWorker.moveToThread(self.receiverThread)
self.receiverThread.start()
class SenderWorker(QObject):
temperatures = pyqtSignal(object)
def __init__(self):
QObject.__init__(self)
self._mutex = QMutex()
self._running = True
@pyqtSlot()
def work(self):
while self._running:
print 'Sender working'
self.temperatures.emit('123')
time.sleep(1)
class ReceiverWorker(QObject):
def __init__(self):
QObject.__init__(self)
self._mutex = QMutex()
self._running = True
def connectSlots(self, sender):
sender.temperatures.connect(self.work)
def work(self, temperatures):
print 'Receiver working: ', temperatures
app = QApplication(sys.argv)
window = Screen()
window.show()
sys.exit(app.exec_())
问题出在连接上,如果您想使用旧样式,则必须输入以下语法:
def connectSlots(self, sender):
self.connect(sender, SIGNAL('temperatures(PyQt_PyObject)'), self.work)
在new style中就简单多了({sender}.{signal}.connect({slot})
):
def connectSlots(self, sender):
sender.temperatures.connect(self.work)