【发布时间】:2020-09-17 11:55:04
【问题描述】:
我正在使用 PyQt5 编写一个管理销售订单的应用程序。创建或删除订单时,我想显示一个 marqee 样式的进度对话框以指示应用程序正在运行。我访问了很多帖子,其中的答案涉及使用 QThread。我试图实现它,但似乎我遗漏了一些东西。这是我的线程类。
class Worker(QThread):
finished = Signal()
def run(self):
self.x = QProgressDialog("Please wait..",None,0,0)
self.x.show()
def stop(self):
self.x.close()
在主窗口的 init 我创建 self.worker=Worker()
现在删除条目的代码例如:
msg = MsgBox("yn", "Delete Order", "Are you sure you want to delete this order?") # Wrapper for the QMessageBox
if msg == 16384:
self.worker.start() ## start the worker thread, hoping to start the progress dialog
session.delete(order) ##delete order from db
session.commit() ##commit to db
self.change_view("Active", 8) ##func. clean up the table.
self.worker.finished.emit() ##emit the finished signal to close the progress dialog
结果是没有显示进度对话框。 gui 只是冻结一两秒钟,然后条目删除,没有显示任何进度对话框。
对不起,我的代码很长,所以我不能在这里全部包含,我只是想看看我是否有什么严重的错误。
【问题讨论】:
-
有一点需要注意,与您遇到的冻结无关,您永远不会使用
self.x.setValue(progress)之类的内容更新进度条。 -
那是因为我只想让它在数据库更新完成之前给出繁忙的指示。这是一个选取框样式栏,因此最小值和最大值都设置为零。
-
哦,好的。然后我相信解决方案在于以下两件事之一:1-您需要保持对进度对话框“活动”的引用并存储在
self中,我的意思是您的程序界面中的self,而不是来自你的班。或 2- 进度对话框需要有一个父级,即您的程序界面。在这两种情况下,您都需要找到一种方法将 self 作为参数传递给 QThread(称之为zelf或其他名称)。 -
您应该将删除订单的操作发送给线程,而不是创建 QDialog。对话框应该在主线程上创建并使用
QThread.started和QThread.finished显示/隐藏信号。
标签: python pyqt5 qthread pyside2 qprogressdialog