2013-06-23 20 views
0

我在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 
} 
+0

你可以發佈一些代碼來幫助我們重現你的問題嗎? –

+0

@Riateche在這裏,你去。 – sobol6803

+0

TreeModel :: reset()是做什麼的?它只是默認的實現嗎? – Phlucious

回答

2

嘗試將您的根路徑更改爲我的電腦而不是C:/。它似乎與Windows 7 x64和Qt 4.8.2中的QFileSystemModel一起工作,但我無法保證其他平臺的任何功能。

rTree_model = new TreeModel(this); 
QString rPath = model->myComputer().toString(); //causes the QFileSystemWatcher to watch every drive? 
rTree_model->setRootPath(rPath); 

ui->rTree->setModel(rTree_model); 
+0

你太棒了!:)我知道這是有道路的東西,但我不知道,有一個'myComputer()'方法。我想如果我有更多的時間,我會最終找到它。無論如何,它現在有效,你得到賞金(14小時,現在不能完成)。你已經贏得了! :) – sobol6803

+0

很高興它的工作!順便說一下,不知道你最初發布的是哪個Qt論壇,但是我的問題在qtcentre.org上已經取得了一些成功。 – Phlucious

+0

我已將它發佈在qt-project.org官方論壇上。感謝您的建議,我會看看這個網站。 :) – sobol6803