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_())

这个信号必须在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)

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

如果你看过PyQt4的教程,它是不一样的。

最新更新