我在Qt官方論壇上寫過這篇文章,但似乎已經死了,所以我要在這裏複製粘貼它。QFileSystemModel和QTreeView - 重置視圖時的奇怪行爲
我正在編寫複製文件的小程序。我使用QTreeView
,我從QFileSystemModel
繼承,所以我能夠在QTreeView
中的每一行添加複選框。我還使用setNameFilters
連接QLineEdit
的方法,因此用戶可以指定他想要在QTreeView
中顯示哪些文件擴展名。我發現了以下行爲:
1)當我運行程序並輸入擴展名以進行過濾時(無需觸摸QTreeView
中的任何節點),一切正常,並且只顯示帶有擴展名的文件(以及當然文件夾)。當我更改擴展並刷新視圖時,在我的"C:/"
驅動器上,所有內容都會更新,並且只顯示新的擴展集。當我擴展一些之前沒有碰到的驅動器時,它也會正確顯示文件。
2)當我運行程序並展開讓我說我的"C:/"
和"D:/"
驅動器我看到所有的目錄和文件(預期的行爲)。然後我寫一些擴展名並刷新視圖。我擴大"C:/"
驅動器,一切正常,只顯示我提供的擴展名的文件。然後我去"D:/"
驅動器,這裏是問題所在。它顯示所有文件。它忽略了我提供的過濾器。當我打開之前沒有打開過的驅動器"E:/"
時,文件被正確過濾,如"C:/"
驅動器。
我得出結論,認爲這種行爲與setRootPath
方法有關,因爲對於我的QTreeView
只有在"C:/"
驅動器中過濾器工作正常。在更換過濾器之前展開的所有其他驅動器都不起作用。那些沒有擴大工作就好了。
問題是:如何讓這個工作,所以在用戶更改過濾器和reset()方法被激發後,整個QTreeView
刷新,而不僅是根路徑和未擴展的元素?也許存在一些將所有驅動器作爲孩子的根路徑,它會按預期工作?或者,也許我應該在QTreeView
中創建一個名爲"MyComputer"
的虛擬文件夾,並將其設置爲所有驅動器的父級?但如何獲得所有可用驅動器的列表?
我希望我寫的內容對你很明確,你可以幫助我做到這一點。
編輯: 添加一些相關的代碼。如果你需要更多的問題。
//setting up the model and view
QString rPath = "C:/";
rTree_model = new TreeModel(this); //TreeModel inherits from QFileSystemModel
rTree_model->setRootPath(rPath);
ui->rTree->setModel(rTree_model); //applies the model for the qtreeview (ui->rTree)
//(...)
//action when extensions were provided by user
QString extensions = QString(ui->extensionBox->text()); //gets extensions provided by user
QStringList filters;
if(extensions.length() > 0) {
filters = extensions.split(";", QString::SkipEmptyParts); //splits extensions provided with ';' as separator
rTree_model->setNameFilters(filters); //applies filters
ui->rTree->reset(); //resets the view
}
你可以發佈一些代碼來幫助我們重現你的問題嗎? –
@Riateche在這裏,你去。 – sobol6803
TreeModel :: reset()是做什麼的?它只是默認的實現嗎? – Phlucious