簡體   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