一千萬個為什麽

搜索

QT:QFileSystemModel _q_fileSystemChanged插槽在UI線程上執行,與文檔相矛盾

我的UI使用QTreeView和QFileSystemModel來選擇文件夾和文件。 QFileSystemModel的文檔說文件結構更新是在一個單獨的線程上完成的,這意味著UI不會被阻止。但是,對我來說情況並非如此,我無法弄清楚這種差異以及其他人是如何解決這個問題的。調試之後,我註意到大部分時間的QFileSystemModel _q_fileSystemChanged槽仍然在主UI線程上執行,這是有意義的。問題是文檔如何聲明,而不是阻止UI。有解決方案嗎?我誤會了什麽嗎?

重申   - 使用QFileSystemDataModel創建QTreeView   - 將根路徑設置為“”或“/”   - 在QFileSystemModel _q_fileSystemChanged槽中設置斷點   - 在應用加載後展開其中一個驅動器

問題:   - 在UI線程上調用插槽,從而阻止應用程序直到完成。

有一些方法可以使文件解析器更快,但我真的需要在一個單獨的線程上執行,並在填充數據並準備好QTreeView時通知。

謝謝, Innokenty

最佳答案

我認為這可能是圖標的原因。在 _q_fileSystemChanged() slot 中調用fileInfoGatherer.getInfo(),其中包括解析路徑的圖標。在它的當前設計 QFileIconProvider 使用 QIcon 來表示圖標, QIcon 只能在UI線程中使用。 QImage 似乎是唯一允許在其他線程中使用的類,但我認為在後臺線程中使用 QImage 並將其轉換為 QIcon

因此,在某些情況下, QFileIconProvider 的平臺實現可能在網絡路徑上很慢,因此會降低UI主線程的速度。

我不知道這是否是您問題的根源,但至少這應該是在UI線程中調用 _q_fileSystemChanged()的原因。

轉載註明原文: QT:QFileSystemModel _q_fileSystemChanged插槽在UI線程上執行,與文檔相矛盾