您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

为什么将QThread创建为局部变量会导致行为不同

为什么将QThread创建为局部变量会导致行为不同

要指出的问题是,这是一个局部变量,启动后会立即销毁它,因此将删除QThreadQThread(QThread不是线程,它是线程处理程序)处理的线程,并在使用wait()时可以预期该run()方法将被执行,但是在生成GUI的主线程中冻结。

因此解决方案是延长变量线程的寿命,一种指出它起作用的方式是:使其成为类的成员,但是还有另一种方法只能将QObjects作为QThread使用,并且传递父级(父对象必须是另一个QObject),它将把对象的寿命延长到与父对象相同的容量,因此我将使用一个对话框。

最后,如今不建议动态创建信号,最好将其创建为类的一部分,对于连接,还必须使用新语法

class UI():
    def __init__(self):
        self.app = QtGui.QApplication(sys.argv)
        self.dialog = QtGui.QDialog()
        self.ui = Ui_Dialog()
        self.ui.setupUi(self.dialog)
        self.ui.btn.clicked.connect(self.btnclick)
        self.dialog.show()

    def btnclick(self):
        thread = testThread(self.dialog)  
        thread.signal.connect(self.output)
        thread.start()

    def output(self, txt):
        self.ui.logText.append(str(txt))

class testThread(QtCore.QThread):
    signal = QtCore.pyqtSignal(str)

    def __del__(self):
        self.wait()

    def run(self):
        for i in range(10):
            QtCore.QThread.sleep(1)
            self.output(str(i))

    def output(self, txt):
        self.signal.emit(txt)

if __name__ == '__main__':
    ui = UI()
    app = QtGui.QApplication.instance()
    if app is not None:
        sys.exit(app.exec_())
其他 2022/1/1 18:43:31 有401人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶