带有 QThread 的 QProgressBar 在 python 中不起作用

问题描述 投票:0回答:1

问候

我正在尝试用 QThread 制作 QProgressBar。 但它不起作用。 我使用了线程,但似乎一切都在主线程上运行。

这是我的代码

import sys
from PySide6.QtWidgets import QApplication, QProgressBar, QWidget, QPushButton, QVBoxLayout
from PySide6.QtCore import QThread, Signal
import time


class Thread(QThread):
    change_value = Signal()

    def run(self):
        self.change_value.emit()
            
class Form(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.pgsb = QProgressBar()
        self.pb = QPushButton("Pause")
        self.th = Thread()
        self.init_widget()
        self.th.change_value.connect(self.update_progressbar)
        self.th.start()

    def init_widget(self):
        layout = QVBoxLayout()
        self.setLayout(layout)
        layout.addWidget(self.pgsb)
        layout.addWidget(self.pb)

    def update_progressbar(self):
        cnt = 0
        while True:
            if cnt == 100:
                cnt = 0
            cnt += 1
            self.pgsb.setValue(cnt)
            time.sleep(0.5)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = Form()
    form.show()
    sys.exit(app.exec())

它不起作用。 但是,以下代码可以正常工作。

import sys
from PySide6.QtWidgets import QApplication, QProgressBar, QWidget, QPushButton, QVBoxLayout
from PySide6.QtCore import QThread, Signal
import time


class Thread(QThread):
    change_value = Signal(int)

    def run(self):
        cnt = 0
        while True:
            if cnt == 100:
                cnt = 0
            cnt += 1
            self.change_value.emit(cnt)
            time.sleep(0.5)


class Form(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.pgsb = QProgressBar()
        self.th = Thread()
        self.init_widget()
        self.th.change_value.connect(self.update_progressbar)
        self.th.start()

    def init_widget(self):
        layout = QVBoxLayout()
        self.setLayout(layout)
        layout.addWidget(self.pgsb)

    def update_progressbar(self, value):
        self.pgsb.setValue(value)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = Form()
    form.show()
    sys.exit(app.exec())

根据当前发生的情况,第一个代码似乎会导致主线程上的 UI 更新。 但我不明白。为什么这段代码的结果不同?

python pyqt pyside6
1个回答
0
投票

QT 中的 GUI 线程(主线程)负责将小部件绘制到屏幕上,在第一个示例中,您在主线程中创建无限循环,这会阻止主线程进行重绘或处理用户交互。

在第二个示例中,另一个线程处于无限循环中,而主线程可以自由处理用户事件并重绘小部件。

作为一般规则,您应该永远不在主线程中执行任何长时间操作,否则您的应用程序将不会响应并且不会更新。

© www.soinside.com 2019 - 2024. All rights reserved.