PyQt使用Qthread但是主线程还是上不去

问题描述 投票:0回答:1

我创建了一个这样的 Pyqt 应用程序:

mainwindow

这个应用程序的功能是当我按下按钮“pushButton”时,它会在后台启动一个函数来计算 0+1+...+1000000;同时主窗口弹出加载对话框,表示正在运行该功能

我用QThread来完成上面的请求,让主线程'MainWindow'弹出加载对话框,同时让线程'WorkThread'计算0+1+...+1000000:

# thread
class WorkThread(QThread):
    imgProcessSignal = Signal()

    def __init__(self):
        QThread.__init__(self)

    def run(self):
        self.imgProcessSignal.emit()

# pop up dialog
class LoadingDialog(QDialog):
    def __init__(self):
        QDialog.__init__(self)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        movie = QMovie(':\icons\images\icons\loading.gif')
        self.ui.label_2.setMovie(movie)
        self.ui.label_2.setScaledContents(False)
        movie.start()
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
        self.show()


# main window
class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()  # create your own UI object
        self.ui.setupUi(self)  # set all the attributes of object[self]

        self.ui.pushButton.clicked.connect(self.buttonClick)

        self.show()

    def buttonClick(self):
        btn = self.sender()
        btnName = btn.objectName()

        if btnName == 'pushButton':
            self.dialog = LoadingDialog()
            self.thread1 = WorkThread()
            self.thread1.imgProcessSignal.connect(self.calculate)
            self.thread1.start()

    def calculate(self):
        sum = 0
        for i in range(100000000):
            sum += i

但是当我运行应用程序时,结果就像下面的 gif:

enter image description here

问题是我在这个弹出的对话框上什么也做不了,loading.gif也不能实现动画效果,好像只有'WorkThread'完成后才能操作这个对话框(例如:关闭对话框)并且 loading.gif 显示不正确。

我使用Qthread有什么问题吗?

我想知道如何让后台线程和主线程分别正确工作。

pyqt pyqt5 pyside pyside2 pyqt6
1个回答
0
投票

你的线程不做任何实际处理。

calculate()
函数仍在主线程中执行。 您必须将计算逻辑放在工作线程中。在
run()
中或在线程中定义
calculate()
方法并从
run()

中调用它

你的工作线程所做的就是在它启动时立即发出一个信号。将该信号连接到主线程中的方法不会使该方法在工作线程中运行。

此外,如果您除了调用父类之外没有添加任何内容,则不必覆盖

__init__

© www.soinside.com 2019 - 2024. All rights reserved.