QThread 不使用事件更新视图
QThread does not update view with events
在菜单上我可以触发:
def on_git_update(self):
update_widget = UpdateView()
self.gui.setCentralWidget(update_widget)
updateGit = UpdateGit()
updateGit.progress.connect(update_widget.on_progress)
updateGit.start()
那么我有:
class UpdateView(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
vbox = QVBoxLayout()
self.pbar = QProgressBar()
vbox.addWidget(self.pbar)
vbox.addStretch(1)
self.setLayout(vbox)
def on_progress(self, value):
self.pbar.setValue(int(value * 100))
class UpdateGit(QThread):
progress = pyqtSignal(float)
def __del__(self):
self.wait()
def run(self):
for i in range(10):
self.progress.emit(i / 10)
sleep(.5)
应用程序在处理过程中冻结,据我所知,它应该像在使用信号的线程中一样工作。
此外,当我通过 pycharm 在调试模式下 运行 它时,它按预期工作,应用程序更新每一步。
我的线程设置不正确怎么办?
在函数中创建的变量仅在函数存在之前存在,这就是updateGit
的情况,在update_widget
的情况下,当它被设置为centralwidget时它有更大的范围因为 Qt 处理它。解决方案是通过使线程成为 class.
的成员来扩展线程的范围
def on_git_update(self):
update_widget = UpdateView()
self.gui.setCentralWidget(update_widget)
self.updateGit = UpdateGit()
self.updateGit.progress.connect(update_widget.on_progress)
self.updateGit.start()
在菜单上我可以触发:
def on_git_update(self):
update_widget = UpdateView()
self.gui.setCentralWidget(update_widget)
updateGit = UpdateGit()
updateGit.progress.connect(update_widget.on_progress)
updateGit.start()
那么我有:
class UpdateView(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
vbox = QVBoxLayout()
self.pbar = QProgressBar()
vbox.addWidget(self.pbar)
vbox.addStretch(1)
self.setLayout(vbox)
def on_progress(self, value):
self.pbar.setValue(int(value * 100))
class UpdateGit(QThread):
progress = pyqtSignal(float)
def __del__(self):
self.wait()
def run(self):
for i in range(10):
self.progress.emit(i / 10)
sleep(.5)
应用程序在处理过程中冻结,据我所知,它应该像在使用信号的线程中一样工作。 此外,当我通过 pycharm 在调试模式下 运行 它时,它按预期工作,应用程序更新每一步。 我的线程设置不正确怎么办?
在函数中创建的变量仅在函数存在之前存在,这就是updateGit
的情况,在update_widget
的情况下,当它被设置为centralwidget时它有更大的范围因为 Qt 处理它。解决方案是通过使线程成为 class.
def on_git_update(self):
update_widget = UpdateView()
self.gui.setCentralWidget(update_widget)
self.updateGit = UpdateGit()
self.updateGit.progress.connect(update_widget.on_progress)
self.updateGit.start()