从 Qrunnable 连接一个 pyqtSignal
connecting a pyqtSignal from Qrunnable
我正在尝试制作一个监控硬件的应用程序,我想使用 Qthreadpool 而不是为每个小部件设置一个线程,但我在连接信号以显示输出时遇到了问题。我也没有收到任何错误。
我的旧代码运行良好并使用 QThread 显示它应该显示的内容:
import sys
from PyQt4 import QtCore, QtGuiimport ui
import time
import mem_stats
class MainClass(QtGui.QMainWindow, ui.Ui_MainWindow):
def __init__(self, parent= None):
super(MainClass, self).__init__(parent)
self.setupUi(self)
self.mem_worker = MemWorker()
self.mem_worker.start()
self.connect(self.mem_worker, QtCore.SIGNAL('MEM_STATS'),self.show_mem_stats)
def show_mem_stats(self, free_mem):
self.free_memory_lcd.display(free_mem)
class MemWorker(QtCore.QThread):
def __init__(self):
super(MemWorker, self).__init__()
def run(self):
while True:
free_mem = mem_stats.free_mem()
self.emit(QtCore.SIGNAL('MEM_STATS'), free_mem)
time.sleep(1)
if __name__ == '__main__':
a = QtGui.QApplication(sys.argv)
app = MainClass()
app.show()
sys.exit(a.exec_())
但是当我将 MemWorker class 更改为 QRunnable 时,代码运行没有错误,但 QlcdNumber 不显示任何内容。
这是我的新代码:
import sys
from PyQt4 import QtCore, QtGui
import ui
import time
import mem_stats
class WorkerSignals(QtCore.QObject):
mem_signal = QtCore.pyqtSignal(int)
class MainClass(QtGui.QMainWindow, ui.Ui_MainWindow):
def __init__(self, parent= None):
super(MainClass, self).__init__(parent)
self.setupUi(self)
self.mem_worker = MemWorker()
self.thread_pool = QtCore.QThreadPool()
self.thread_pool.setMaxThreadCount(2)
self.connect(self.mem_worker.signal, QtCore.SIGNAL('MEM_STATS'), self.show_mem_stats)
def show_mem_stats(self, free_mem):
self.free_memory_lcd.display(free_mem)
self.thread_pool.start(self.mem_worker)
class MemWorker(QtCore.QRunnable):
def __init__(self):
super(MemWorker, self).__init__()
self.signal = WorkerSignals()
def run(self):
while True:
free_mem = mem_stats.free_mem()
self.signal.mem_signal.emit(QtCore.SIGNAL('MEM_STATS'), free_mem)
time.sleep(1)
if __name__ == '__main__':
a = QtGui.QApplication(sys.argv)
app = MainClass()
app.show()
sys.exit(a.exec_())
问题是你没有启动QRunnable
,你想在插槽中启动它,如果QRunnable
没有启动它就永远不会被调用。另一方面,目前建议使用 the new connection syntax, and finally it is recommended to use the @pyqtSlot decorator
从 C++ 端建立连接,从而以更少的资源使其更快。
from PyQt4 import QtCore, QtGui
import ui
import time
import mem_stats
class WorkerSignals(QtCore.QObject):
mem_signal = QtCore.pyqtSignal(int)
class MainClass(QtGui.QMainWindow, ui.Ui_MainWindow):
def __init__(self, parent= None):
super(MainClass, self).__init__(parent)
self.setupUi(self)
self.mem_worker = MemWorker()
self.thread_pool = QtCore.QThreadPool()
self.thread_pool.setMaxThreadCount(2)
self.mem_worker.signal.mem_signal.connect(self.show_mem_stats)
self.thread_pool.start(self.mem_worker)
@QtCore.pyqtSlot(int)
def show_mem_stats(self, free_mem):
self.free_memory_lcd.display(free_mem)
class MemWorker(QtCore.QRunnable):
def __init__(self):
super(MemWorker, self).__init__()
self.signal = WorkerSignals()
def run(self):
while True:
ree_mem = mem_stats.free_mem()
self.signal.mem_signal.emit(free_mem)
time.sleep(1)
if __name__ == '__main__':
import sys
a = QtGui.QApplication(sys.argv)
app = MainClass()
app.show()
sys.exit(a.exec_())
我正在尝试制作一个监控硬件的应用程序,我想使用 Qthreadpool 而不是为每个小部件设置一个线程,但我在连接信号以显示输出时遇到了问题。我也没有收到任何错误。
我的旧代码运行良好并使用 QThread 显示它应该显示的内容:
import sys
from PyQt4 import QtCore, QtGuiimport ui
import time
import mem_stats
class MainClass(QtGui.QMainWindow, ui.Ui_MainWindow):
def __init__(self, parent= None):
super(MainClass, self).__init__(parent)
self.setupUi(self)
self.mem_worker = MemWorker()
self.mem_worker.start()
self.connect(self.mem_worker, QtCore.SIGNAL('MEM_STATS'),self.show_mem_stats)
def show_mem_stats(self, free_mem):
self.free_memory_lcd.display(free_mem)
class MemWorker(QtCore.QThread):
def __init__(self):
super(MemWorker, self).__init__()
def run(self):
while True:
free_mem = mem_stats.free_mem()
self.emit(QtCore.SIGNAL('MEM_STATS'), free_mem)
time.sleep(1)
if __name__ == '__main__':
a = QtGui.QApplication(sys.argv)
app = MainClass()
app.show()
sys.exit(a.exec_())
但是当我将 MemWorker class 更改为 QRunnable 时,代码运行没有错误,但 QlcdNumber 不显示任何内容。
这是我的新代码:
import sys
from PyQt4 import QtCore, QtGui
import ui
import time
import mem_stats
class WorkerSignals(QtCore.QObject):
mem_signal = QtCore.pyqtSignal(int)
class MainClass(QtGui.QMainWindow, ui.Ui_MainWindow):
def __init__(self, parent= None):
super(MainClass, self).__init__(parent)
self.setupUi(self)
self.mem_worker = MemWorker()
self.thread_pool = QtCore.QThreadPool()
self.thread_pool.setMaxThreadCount(2)
self.connect(self.mem_worker.signal, QtCore.SIGNAL('MEM_STATS'), self.show_mem_stats)
def show_mem_stats(self, free_mem):
self.free_memory_lcd.display(free_mem)
self.thread_pool.start(self.mem_worker)
class MemWorker(QtCore.QRunnable):
def __init__(self):
super(MemWorker, self).__init__()
self.signal = WorkerSignals()
def run(self):
while True:
free_mem = mem_stats.free_mem()
self.signal.mem_signal.emit(QtCore.SIGNAL('MEM_STATS'), free_mem)
time.sleep(1)
if __name__ == '__main__':
a = QtGui.QApplication(sys.argv)
app = MainClass()
app.show()
sys.exit(a.exec_())
问题是你没有启动QRunnable
,你想在插槽中启动它,如果QRunnable
没有启动它就永远不会被调用。另一方面,目前建议使用 the new connection syntax, and finally it is recommended to use the @pyqtSlot decorator
从 C++ 端建立连接,从而以更少的资源使其更快。
from PyQt4 import QtCore, QtGui
import ui
import time
import mem_stats
class WorkerSignals(QtCore.QObject):
mem_signal = QtCore.pyqtSignal(int)
class MainClass(QtGui.QMainWindow, ui.Ui_MainWindow):
def __init__(self, parent= None):
super(MainClass, self).__init__(parent)
self.setupUi(self)
self.mem_worker = MemWorker()
self.thread_pool = QtCore.QThreadPool()
self.thread_pool.setMaxThreadCount(2)
self.mem_worker.signal.mem_signal.connect(self.show_mem_stats)
self.thread_pool.start(self.mem_worker)
@QtCore.pyqtSlot(int)
def show_mem_stats(self, free_mem):
self.free_memory_lcd.display(free_mem)
class MemWorker(QtCore.QRunnable):
def __init__(self):
super(MemWorker, self).__init__()
self.signal = WorkerSignals()
def run(self):
while True:
ree_mem = mem_stats.free_mem()
self.signal.mem_signal.emit(free_mem)
time.sleep(1)
if __name__ == '__main__':
import sys
a = QtGui.QApplication(sys.argv)
app = MainClass()
app.show()
sys.exit(a.exec_())