如何在QT4 for Windows中创建通用文件选择对话框

时间:2013-06-15 00:05:37

标签: windows qt filedialog

我一直在寻找这个问题的线索,但没有结果。所以,这里......

我有一个应用程序,我想要一个简单的按钮来打开文件对话框窗口。主窗口上还有其他按钮可以读取或创建/写入文件(在对所选功能进行适当检查后)。我以前使用QFileDialog :: getSaveFileName()函数没有问题,但是对于Windows 7,如果文件存在并且是只读的,则会失败。我切换到getOpenFileName()来解决这个问题,但是如果用户试图选择一个不存在的文件(与保存操作无关),现在文件对话框会失败。

有没有办法在文件对话框中添加“创建新文件”图标,或将其添加到文件对话框窗口中的右键菜单?我真的很想因为(另一种)Windows行为改变而不得不重写应用程序。

2 个答案:

答案 0 :(得分:1)

QFileDialog::getOpenFileName()只应用于打开现有文件。如果键入不存在的文件名并且系统抱怨,则这是正确的行为。它正确告诉您无法打开不存在的文件。

如果您要写入现有文件或创建新文件,您应该使用QFileDialog::getSaveFileName()

如果您尝试写入在操作系统中标记为只读的现有文件,并且您收到错误消息,指出该文件是只读的,则错误是正确的。不应该允许您写入只读文件,这就是Read-Only的含义。

根据您的解释,这里没有错误。一切都在发生。如果您试图强制系统执行不同的操作,请不要这样做。你应该尝试以不同的方式思考。

答案 1 :(得分:0)

好吧,因为这里从来没有真正回答过这个问题,而且我已经找到了解决方案,所以我想我将使用我正在使用的代码段对此进行更新。

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/查看整个代码。希望这对正在寻求解决方案的下一个人有所帮助。如果您使用我们的代码,请注明出处。