подключение pyqtSignal из Qrunnable - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь создать приложение, которое отслеживает оборудование, я хотел бы использовать 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 на 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_())

1 Ответ

0 голосов
/ 30 октября 2018

Проблема в том, что вы не запускаете QRunnable, вы хотите запустить его в слоте, и он никогда не будет вызван, если QRunnable не запущен. С другой стороны, в настоящее время рекомендуется использовать новый синтаксис соединения , и, наконец, рекомендуется использовать @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_())
...