簡體   English   中英

如何在Windows版QT4中創建通用文件選擇對話框

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM