如何将线程添加到 PyQt5 GUI?

How to can I add threading to PyQt5 GUI?

所以我使用 QT Designer 创建了一个 GUI。它工作得很好,但在更复杂的调用中它不会更新主 window 并锁定。我想 运行 我的 CustomComplexFunction(),同时从不断变化的后端信息更新主要 window 中的文本编辑,我希望它每 2 秒 运行。下面的代码似乎是正确的并且 运行s 没有错误,但是没有更新 textEdit。请注意,我正在导入一个由 QT Designer 设计的带有按钮和文本编辑器的 .ui 文件,如果没有它,代码将不会 运行。

Main.py

import sys
from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout, QMainWindow
from PyQt5.QtCore import QCoreApplication, QObject, QRunnable, QThread, QThreadPool, pyqtSignal, pyqtSlot
from PyQt5 import uic, QtGui

class Worker(QObject):
    newParams = pyqtSignal()

    @pyqtSlot()
    def paramUp(self):
        x=1
        for x in range(100):
            time.sleep(2)
            self.newParams.emit()
            print ("sent new params")
            x +=1

Ui_somewindow, _ = uic.loadUiType("mainwindow.ui") #the path to UI

class SomeWindow(QMainWindow, Ui_somewindow, QDialog):

    def __init__(self):

        QMainWindow.__init__(self)
        Ui_somewindow.__init__(self)
        self.setupUi(self)

        # Start custom functions
        self.params = {}
        self.pushButton.clicked.connect(self.complex) #NumEvent

    def complex(self):
        self.work = Worker() 
        self.thread = QThread()

        self.work.newParams.connect(self.changeTextEdit)
        self.work.moveToThread(self.thread)
        self.thread.start()

        self.CustomComplexFunction()

    def CustomComplexFunction(self):
        self.params['City'] = 'Test'

    def changeTextEdit(self):

        try: 
            City = self.params['City']
            self.textEdit_14.setPlainText(City) 
        except KeyError:
            City = None
if __name__ == "__main__":

    app = QApplication(sys.argv)
    window = SomeWindow()
    window.show()
    sys.exit(app.exec_())

您可以查看 Signals and Slots here and this SO post 的官方文档也很有帮助,但我似乎 ui 是正确的。根据文档,发射器不关心信号是否被使用。这可能就是代码没有错误但也不起作用的原因。

关于如何让它发挥作用有什么想法吗?或者至少有一些方法可以测试发射器和信号??

您忘记将线程连接到工作对象。

self.work = Worker()
self.thread = QThread()
self.thread.started.connect(self.worker.work) # <--new line, make sure work starts.
self.thread.start()

祝申请顺利 :-)