问候
我正在尝试用 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 更新。 但我不明白。为什么这段代码的结果不同?
QT 中的 GUI 线程(主线程)负责将小部件绘制到屏幕上,在第一个示例中,您在主线程中创建无限循环,这会阻止主线程进行重绘或处理用户交互。
在第二个示例中,另一个线程处于无限循环中,而主线程可以自由处理用户事件并重绘小部件。
作为一般规则,您应该永远不在主线程中执行任何长时间操作,否则您的应用程序将不会响应并且不会更新。