我一直在寻找这个问题的线索,但没有结果。所以,这里......
我有一个应用程序,我想要一个简单的按钮来打开文件对话框窗口。主窗口上还有其他按钮可以读取或创建/写入文件(在对所选功能进行适当检查后)。我以前使用QFileDialog :: getSaveFileName()函数没有问题,但是对于Windows 7,如果文件存在并且是只读的,则会失败。我切换到getOpenFileName()来解决这个问题,但是如果用户试图选择一个不存在的文件(与保存操作无关),现在文件对话框会失败。
有没有办法在文件对话框中添加“创建新文件”图标,或将其添加到文件对话框窗口中的右键菜单?我真的很想因为(另一种)Windows行为改变而不得不重写应用程序。
答案 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/查看整个代码。希望这对正在寻求解决方案的下一个人有所帮助。如果您使用我们的代码,请注明出处。