如何从另一个模块更新 QProgressbar?

How to update QProgressbar from another module?

我想从另一个模块更新主 gui class 中的进度条。由于必须更新进度条值,而 gui 在其主事件循环中仍为 运行,因此我为其创建了一个线程。我无法从线程更新进度值。

这只是我真正想做的事情的基本代码,但它会产生同样的错误。

progress.py

from time import sleep
from PyQt5.QtCore import QObject, pyqtSignal


class ProgressUpdate(QObject):

progress_signal = pyqtSignal(int)

def __init__(self):
    super().__init__()
    self.progress_update()

def progress_update(self):
    for i in range(0, 101):
        self.progress_signal.emit(i)
        sleep(0.01)

main.py

from PyQt5.QtWidgets import QVBoxLayout, QApplication, QProgressBar, QWidget
from PyQt5 import QtCore
import sys
from progress import ProgressUpdate


class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):

        self.progress_bar = QProgressBar(self)
        self.vbox = QVBoxLayout(self)
        self.vbox.addWidget(self.progress_bar)
        self.setLayout(self.vbox)
        self.setWindowTitle('Progress')
        self.p_thread = ProgressThread()
        self.p_thread.start()
        self.show()

    def update_progress(self, val):
        self.progress_bar.setValue(val)


class ProgressThread(QtCore.QThread):

    def __init__(self):
        super().__init__()

    def run(self):
        self.obj = ProgressUpdate()
        self.obj.progress_signal.connect(Example.update_progress)
    

def main():
    app = QApplication(sys.argv)
    p = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

当我运行这个时候,进度条出现了,但是一直是0,没有更新。

您不需要单独的 QObject 和线程,这使得正确连接信号和槽变得更加困难。 progress.py 文件可以包含带有循环的 QThread,以在每个时间间隔发出值。

class ProgressThread(QtCore.QThread):

    progress_signal = pyqtSignal(int)

    def __init__(self):
        super().__init__()

    def run(self):
        for i in range(0, 101):
            self.progress_signal.emit(i)
            sleep(0.01)

并且在 main.py 中,将信号从线程连接到 class 中的插槽。

class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):

        self.progress_bar = QProgressBar(self)
        self.vbox = QVBoxLayout(self)
        self.vbox.addWidget(self.progress_bar)
        self.setLayout(self.vbox)
        self.setWindowTitle('Progress')
        self.p_thread = ProgressThread()
        self.p_thread.progress_signal.connect(self.update_progress)
        self.p_thread.start()
        self.show()

    def update_progress(self, val):
        self.progress_bar.setValue(val)

    
def main():
    app = QApplication(sys.argv)
    p = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()