PyQt5信号和线程

ryn*_*n1x 5 python qt pyqt python-3.x pyqt5

我在youtube上观看了关于PyQt4信号的简短教程,并且无法运行一个小样本程序.如何将从线程发出的信号连接到主窗口?

import cpuUsageGui
import sys
import sysInfo
from PyQt5 import QtCore

"""Main window setup"""
app = cpuUsageGui.QtWidgets.QApplication(sys.argv)
Form = cpuUsageGui.QtWidgets.QWidget()
ui = cpuUsageGui.Ui_Form()
ui.setupUi(Form)

def updateProgBar(val):
    ui.progressBar.setValue(val)

class ThreadClass(QtCore.QThread):
    def run(self):
        while True:
            val = sysInfo.getCpu()
            self.emit(QtCore.pyqtSignal('CPUVALUE'), val)

threadclass = ThreadClass()

# This section does not work
connect(threadclass, QtCore.pyqtSignal('CPUVALUE'), updateProgBar)
# This section does not work

if __name__ == "__main__":
    threadclass.start()
    Form.show()
    sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

Sye*_*lec 8

必须在ThreadClass内部或之前创建信号,但是当您在ThreadClass中发出信号时,最好在类中创建它.

创建后,您需要将其连接到进度条功能.以下是在您的课程中创建和连接的信号示例.

class ThreadClass(QtCore.QThread):
    # Create the signal
    sig = QtCore.pyqtSignal(int)

    def __init__(self, parent=None):
        super(ThreadClass, self).__init__(parent)

        # Connect signal to the desired function
        self.sig.connect(updateProgBar)

    def run(self):
        while True:
            val = sysInfo.getCpu()

            # Emit the signal
            self.sig.emit(val)
Run Code Online (Sandbox Code Playgroud)

请记住,自PyQt5:描述以来,信号已经改变了样式

如果您看过PyQt4的教程,那就不一样了.