我创建了一个这样的 Pyqt 应用程序:
这个应用程序的功能是当我按下按钮“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:
问题是我在这个弹出的对话框上什么也做不了,loading.gif也不能实现动画效果,好像只有'WorkThread'完成后才能操作这个对话框(例如:关闭对话框)并且 loading.gif 显示不正确。
我使用Qthread有什么问题吗?
我想知道如何让后台线程和主线程分别正确工作。
你的线程不做任何实际处理。
calculate()
函数仍在主线程中执行。
您必须将计算逻辑放在工作线程中。在run()
中或在线程中定义calculate()
方法并从run()
中调用它
你的工作线程所做的就是在它启动时立即发出一个信号。将该信号连接到主线程中的方法不会使该方法在工作线程中运行。
此外,如果您除了调用父类之外没有添加任何内容,则不必覆盖
__init__
。