代码之家  ›  专栏  ›  技术社区  ›  Tjorriemorrie

QThread不使用事件更新视图

  •  1
  • Tjorriemorrie  · 技术社区  · 6 年前

    在菜单上我可以触发:

    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 回复  |  直到 6 年前
        1
  •  1
  •   eyllanesc RAHUL KUMAR    6 年前

    函数中创建的变量只存在于函数存在之前,这就是发生的情况。 updateGit ,对于 update_widget 当设置为centralwidget时,它的作用域更大,因为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()