QThread不会使用事件更新视图

时间:2018-07-24 03:12:06

标签: python multithreading pyqt pyqt5 qthread

在菜单上,我可以触发:

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在调试模式下运行应用程序时,它会按预期更新应用程序的每一步。 我的线程设置不正确吗?

1 个答案:

答案 0 :(得分:1)

在函数中创建的变量仅在函数存在之前存在,并且updateGit会发生这种情况,对于update_widget,将其设置为中央窗口时,由于Qt的作用域更大处理它。解决方案是通过使线程成为类的成员来扩展线程的范围。

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