Save File

Alles rund um die Programmierung mit Qt
iaby
Beiträge: 53
Registriert: 10. Februar 2007 13:12

Beitrag von iaby »

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...
iaby
Beiträge: 53
Registriert: 10. Februar 2007 13:12

Beitrag von iaby »

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.

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;
}
Burgpflanze
Beiträge: 89
Registriert: 24. Februar 2006 16:41
Wohnort: Dresden

Beitrag von Burgpflanze »

iaby hat geschrieben:... oder hast du kein Windows (worum ich dich sehr beneiden würde ;) ).
Ich beneide ihn nicht :wink:
Gruß, Peter
ObeliX
Beiträge: 59
Registriert: 14. November 2007 17:47

Beitrag von ObeliX »

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
Antworten