gpt4 book ai didi

python - QMessageBox 在计算时阻止父级

转载 作者:行者123 更新时间:2023-12-01 00:03:44 24 4
gpt4 key购买 nike

我想在计算时使用QMessageBox来阻止其父QDialog。我遇到了类似的事情,但这不起作用。

msgBox = QtWidgets.QMessageBox()
msgBox.setWindowTitle('Working ....')
msgBox.setText("Working, please wait ...")
msgBox.setStandardButtons(QtWidgets.QMessageBox.NoButton)
msgBox.exec_()

(doing some time consuming work)

msgBox.close()

出了什么问题,我该如何正确处理?

最佳答案

你必须在另一个线程中执行耗时的任务,并通过信号发出任务执行完毕的信号。要关闭QMessageBox,您必须使用accept()方法:

import threading

from PyQt5 import QtCore, QtWidgets


class Worker(QtCore.QObject):
started = QtCore.pyqtSignal()
finished = QtCore.pyqtSignal()

def execute(self, func, args):
threading.Thread(target=self._execute, args=(func, args,), daemon=True).start()

def _execute(self, func, args):
self.started.emit()
func(*args)
self.finished.emit()


def consuming_work(arg1, arg2):
import time

print(arg1, arg2)
time.sleep(5)
print("finish")


if __name__ == "__main__":
import sys

app = QtWidgets.QApplication(sys.argv)

msgBox = QtWidgets.QMessageBox()
msgBox.setWindowTitle("Working ....")
msgBox.setText("Working, please wait ...")
msgBox.setStandardButtons(QtWidgets.QMessageBox.NoButton)
worker = Worker(msgBox)
worker.finished.connect(msgBox.accept)
worker.execute(consuming_work, ["Stack", "Overflow"])
msgBox.exec_()

更新:

import threading

from PyQt5 import QtCore, QtWidgets


class WorkerMessageBox(QtWidgets.QMessageBox):
started = QtCore.pyqtSignal()
finished = QtCore.pyqtSignal()

def __init__(self, parent=None):
super().__init__(parent)
self.finished.connect(self.accept)

def execute(self, func, args):
threading.Thread(target=self._execute, args=(func, args,), daemon=True).start()
return self.exec_()

def _execute(self, func, args):
self.started.emit()
func(*args)
self.finished.emit()


def consuming_work(arg1, arg2):
import time

print(arg1, arg2)
time.sleep(5)
print("finish")


if __name__ == "__main__":
import sys

app = QtWidgets.QApplication(sys.argv)

msgBox = WorkerMessageBox()
msgBox.setWindowTitle("Working ....")
msgBox.setText("Working, please wait ...")
msgBox.setStandardButtons(QtWidgets.QMessageBox.NoButton)

msgBox.execute(consuming_work, ["Stack", "Overflow"])

关于python - QMessageBox 在计算时阻止父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60130601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com