2016-02-13 48 views
2

我需要選擇一個包含文件「* .in」的目錄。 但是,如果我使用getExistingDirectory,我無法指定文件過濾器,所以我看不到文件。如何在QFileDialog :: getExistingDirectory中指定文件過濾器?

但我只需要看到「* .in」文件,我可以只選擇一個目錄,而不是文件。 現在我用這個代碼:

qDebug() << QFileDialog::getExistingDirectory(this, tr("Выберите папку с файлами устройств"), "", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); 

,我無法看到選擇目錄中的所有文件(對話)。

我該怎麼做?

+1

改爲使用getOpenFileName。 – 2016-02-13 21:52:21

回答

2

您需要通過QFileDialog::DontUseNativeDialog選項。從getExistingDirectorydocumentation

在Windows和OS X,這個靜態函數將使用本地文件 對話框而不是QFileDialog。但是,本機Windows文件對話框 不支持在目錄選擇器中顯示文件。您需要 傳遞DontUseNativeDialog以使用QFileDialog顯示文件。在Windows CE的 上,如果設備沒有本機文件對話框,將使用QFileDialog 。

過濾顯示通過擴展名的文件,你將不得不做稍微:

QFileDialog dlg(nullptr, tr("Choose Directory")); 
dlg.setOptions(QFileDialog::DontUseNativeDialog | QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); 
dlg.setFileMode(QFileDialog::Directory); 
dlg.setNameFilter(tr("Directories with device files (*.in)")); 
if (dlg.exec()) 
    qDebug() << dlg.selectedFiles(); 

當我嘗試這樣做,仍顯示不符合過濾條件的文件,但在灰色(我試着在MacOS上,也許你會在Windows上有更多的運氣)。

沒有標準的方法來阻止用戶選擇不包含與過濾器匹配的文件的文件夾。一種解決方案是從QFileDialog派生自己的類並覆蓋accept函數(不會從覆蓋中調用QFileDialog::accept將阻止對話框關閉)。

0

我認爲它不適用於get-dir方法。讓用戶選擇任何* .in文件,然後使用QFileInfo::path獲取該文件的目錄也是可以接受的嗎?

QString inFile = QFileDialog::getOpenFileName(
    this, 
    tr("Выберите папку с файлами устройств " 
     "выделив какой-либо из файлов устройств :-)" 
    ), 
    lastSelectedDir, 
    "*.in" 
); 
QString dirName = QFileInfo(inFile).absolutePath(); 
相關問題