[英]How to create a generic file selection dialog in QT4 for Windows
我一直在尋找有關此問題的線索,但沒有結果。 所以,這里...
我有一個應用程序,想要一個簡單的按鈕來打開文件對話框窗口。 主窗口上還有其他按鈕可以讀取或創建/寫入文件(在對所選功能進行適當檢查之后)。 我曾經使用QFileDialog :: getSaveFileName()函數,沒有問題,但是在Windows 7中,如果文件存在且為只讀,則失敗。 我切換到getOpenFileName()來解決此問題,但是現在,如果用戶嘗試選擇不存在的文件(與保存操作無關),則文件對話框將失敗。
是否可以在文件對話框中添加“創建新文件”圖標,或將其添加到文件對話框窗口中的右鍵菜單? 我真的很討厭因為Windows行為更改而不得不重寫應用程序。
QFileDialog::getOpenFileName()
僅應用於打開現有文件。 如果您鍵入了不存在的文件名並且系統抱怨,這是正確的行為。 正確地告訴您無法打開不存在的文件。
如果要寫入現有文件或創建新文件,則應使用QFileDialog::getSaveFileName()
如果您嘗試寫入一個在操作系統中標記為只讀的現有文件,並且收到一條錯誤消息,指出該文件為只讀,則該錯誤是正確的。 您不應該被允許寫一個只讀文件,這就是只讀的意思。
根據您的解釋,這里沒有錯誤。 一切都應該發生。 如果您試圖迫使系統執行其他操作,請不要這樣做。 您應該嘗試以不同的方式思考問題。
好的,因為這里從來沒有真正回答過這個問題,而且我已經找到了解決方案,所以我想我將使用我正在使用的代碼段進行更新。
void MainWindow::on_tbBrowse_clicked()
{
// Use the location of already entered file
QString fileLocation = leFile->text();
QFileInfo fileinfo(fileLocation);
// See if there is a user-defined file extension.
QString fileType = qgetenv("DiskImagerFiles");
if (fileType.length() && !fileType.endsWith(";;"))
{
fileType.append(";;");
}
fileType.append(tr("Disk Images (*.img *.IMG);;*.*"));
// create a generic FileDialog
QFileDialog dialog(this, tr("Select a disk image"));
dialog.setNameFilter(fileType);
dialog.setFileMode(QFileDialog::AnyFile);
dialog.setViewMode(QFileDialog::Detail);
dialog.setConfirmOverwrite(false);
if (fileinfo.exists())
{
dialog.selectFile(fileLocation);
}
else
{
dialog.setDirectory(myHomeDir);
}
if (dialog.exec())
{
// selectedFiles returns a QStringList - we just want 1 filename,
// so use the zero'th element from that list as the filename
fileLocation = (dialog.selectedFiles())[0];
if (!fileLocation.isNull())
{
leFile->setText(fileLocation);
QFileInfo newFileInfo(fileLocation);
myHomeDir = newFileInfo.absolutePath();
}
setReadWriteButtonState();
updateHashControls();
}
}
setReadWriteButtonState()將根據文件狀態啟用按鈕:
整個代碼可在https://sourceforge.net/projects/win32diskimager/上供他人查看。 希望這對正在尋求解決方案的下一個人有所幫助。 如果您使用我們的代碼,請注明出處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.