So ich hab es jetzt vorerst mal so "gelöst":
Ich benutze nicht mehr die static Methode, sonder erstelle mir ein Objekt vom Typ QFileDialog dem ich dann mit setDefaultSuffix() eine standard Erweiterung für Dateinamen übergebe.
Wenn jetzt ein Dateiname ohne Erweiterung angegeben wird, so hängt Qt immer diesen Suffix an.
Etwas unschön ist, dass wenn ich als suffix z.B. "txt" definiere und im SaveDialog "html" als Filter ausgewählt ist, er mir dann trotzdem ein txt draus macht wenn keine Erweiterung bei dem Dateiname angegeben wurde.
Aber vielleicht finde ich hierfür ja auch noch eine Lösung...
Save File
Hier mal meine Lösung, falls es noch jemand gebrauchen kann!
Kritik ist auch willkommen.
Noch kurz zur Funktion: Sie erwartet als Filter in etwa folgendes: "Bitmap (*.bmp)"
Wenn nun keine Dateiname-Erweiterung vom User angegeben wird, so extrahiert die Funktion aus dem Filter die Erweiterung und hängt sie an die Datei an. Wenn die Datei schon existiert, wird der User gefragt was er machen will und dann ggfs. die getSaveFileName Funktion nochmals rekursiv aufgerufen.
Kritik ist auch willkommen.
Noch kurz zur Funktion: Sie erwartet als Filter in etwa folgendes: "Bitmap (*.bmp)"
Wenn nun keine Dateiname-Erweiterung vom User angegeben wird, so extrahiert die Funktion aus dem Filter die Erweiterung und hängt sie an die Datei an. Wenn die Datei schon existiert, wird der User gefragt was er machen will und dann ggfs. die getSaveFileName Funktion nochmals rekursiv aufgerufen.
Code: Alles auswählen
bool getSaveFileName(QWidget *parent, QString caption, QString filter, QString *fileName)
{
if (fileName == NULL) // "parent" is allowed to be NULL!
return false;
QFileDialog saveDialog(parent);
saveDialog.setWindowTitle(caption);
saveDialog.setAcceptMode(QFileDialog::AcceptSave);
saveDialog.setConfirmOverwrite(false);
saveDialog.setFilter(filter);
saveDialog.selectFile(*fileName);
*fileName = "";
if (!saveDialog.exec())
return false; // User pressed "Cancel"
QStringList fileList = saveDialog.selectedFiles();
if (fileList.count() != 1)
return false; // Should not happen, just to be sure
QString tmpFileName = fileList.at(0);
QFileInfo fileInfo(tmpFileName);
if (fileInfo.suffix().isEmpty()) {
// Add the suffix selected by the user
QString extension = saveDialog.selectedFilter();
extension = extension.right(extension.size() - extension.indexOf("*.") - 2);
extension = extension.left(extension.indexOf(")"));
extension = extension.simplified();
// If the filter specifies more than one extension, choose the first one
if (extension.indexOf(" ") != -1)
extension = extension.left(extension.indexOf(" "));
tmpFileName = tmpFileName + QString(".") + extension;
fileInfo.setFile(tmpFileName);
}
// Does the file already exist?
if (QFile::exists(tmpFileName)) {
int result = QMessageBox::question(parent, QObject::tr("Overwrite?"),
QObject::tr("Do you want to overwrite \"%1\"?").arg(fileInfo.fileName()),
QMessageBox::Yes,
QMessageBox::No | QMessageBox::Default,
QMessageBox::Cancel | QMessageBox::Escape);
if (result == QMessageBox::Cancel)
return false;
else if (result == QMessageBox::No) {
// Next chance for the user to select a filename
if (!getSaveFileName(parent, caption, filter, &tmpFileName))
// User decided to cancel, exit function here
return false;
// User clicked "Yes", so process the execution
fileInfo.setFile(tmpFileName);
}
}
*fileName = tmpFileName;
return true;
}
-
- Beiträge: 89
- Registriert: 24. Februar 2006 16:41
- Wohnort: Dresden
also ich verstehe das mit den filtern im QDialog so :
filter-parameter ist nur ein filter dafür welche files in der anzeige erscheinen sollen. das hat also nichts mit dem namen zu tun der zum speichern zurück gegeben wird.
dieser 'anzeige'-filter kann aus mehreren einzel-filtern bestehen und jeder einzel-filter zudem aus mehreren endungen.
(also 'Images (*.png *.xpm *.jpg)'
und 'Imagebeschreibung (*.txt)'
und 'Alles anzeigen (*.*)')
mit dem selectedFilter-parameter wählt man nur einen dieser drei einzel-filter aus.
aus dem filter/selectedFilter-parameter kann der dialog den eingegebenen oder ausgewählten filenamen nicht automatisch ergänzen, da er ja nicht entscheiden kann ob er zb.beim (einzel-)filter 'Images (*.png *.xpm *.jpg)' nun '.png','.xpm' oder '.jpg' nehmen soll.
MfG Obel
filter-parameter ist nur ein filter dafür welche files in der anzeige erscheinen sollen. das hat also nichts mit dem namen zu tun der zum speichern zurück gegeben wird.
dieser 'anzeige'-filter kann aus mehreren einzel-filtern bestehen und jeder einzel-filter zudem aus mehreren endungen.
(also 'Images (*.png *.xpm *.jpg)'
und 'Imagebeschreibung (*.txt)'
und 'Alles anzeigen (*.*)')
mit dem selectedFilter-parameter wählt man nur einen dieser drei einzel-filter aus.
aus dem filter/selectedFilter-parameter kann der dialog den eingegebenen oder ausgewählten filenamen nicht automatisch ergänzen, da er ja nicht entscheiden kann ob er zb.beim (einzel-)filter 'Images (*.png *.xpm *.jpg)' nun '.png','.xpm' oder '.jpg' nehmen soll.
MfG Obel