繁体   English   中英

getOpenFileName上的进度栏

[英]Progress Bar over getOpenFileName

在我的应用程序中,我有以下代码行打开文件对话框窗口。 一旦获得文件名,我将进行大量的处理,这需要花费一些时间,并且一旦完成,工作区就可以为用户准备好了。

filename, _ = QtGui.QFileDialog.getOpenFileName(self, 'Open file', os.curdir, "*.cws")

文件对话框是一个模式窗口(默认情况下),非常好,因为它可以防止用户在工作空间尚未准备好使用时做一些愚蠢的事情。 我想在某个位置放置进度条,以了解已处理的数量。 我制作了另一个对话框窗口,其中显示进度条和一些其他信息。

现在,由于文件对话框窗口是模态的,因此在我的工作空间正在处理时,它只是冻结在那里,进度对话框仅在完成所有操作后弹出。

我研究过将文件对话框窗口设置为非模态,但我认为这是不可能的。 我当时想强制关闭它,然后立即弹出进度对话框窗口并接管该模式。 如何以编程方式关闭文件对话框窗口? 我不知道如何获得表格的参考。

或者,也许您对如何解决这个问题有更好的建议?

正如thuga所提到的,您的应用程序事件循环被繁重的处理所卡住。 因此,在您的处理正在运行时,不会处理事件(尤其是绘画事件),从而导致GUI冻结。

我认为您有2种选择:

强制处理事件(不是很经典,但可能会起作用):

这取决于您的“繁重处理”的完成方式。 假设挂在循环中的代码是“在您的手中”(不在第三方库中)。 您可以在其中添加尽可能多的对QApplication.processEvents的调用。

如果处理是基于循环的,则可能如下所示:

for item in itemList:
    ...processitem...
    QtGui.QApplication.processEvents()

这是在不应该意识到的部分代码中向GUI添加依赖项的主要缺点。 如果您的代码不是基于循环的,那么您将不得不添加多个对processEvents的调用,这将污染处理代码。

停止挂起事件循环(更复杂但更易于维护)

这意味着您将不得不按照thuga的建议处理线程和/或子进程。 该解决方案假定GUI代码和业务代码充分分开。

您可以查看《 Qt季刊》上的这篇文章该文章对这一问题进行了重点介绍。 由于使用python全局解释器锁定(GIL),您可能看不到线程的更好结果。 考虑使用多处理库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM