Save File

Alles rund um die Programmierung mit Qt
TheDON
Beiträge: 21
Registriert: 18. April 2006 22:25

Save File

Beitrag von TheDON »

Hallo Zusammen!
Entschuldigt die newbie Frage... aber wie kann ich eine leere, neue Datei einfach anlegen?

Soweit bin ich gekommen:

Code: Alles auswählen

	QString file = QFileDialog::getSaveFileName(
                    0,
					"Neue Datei erstellen:",
					"C:\",
                    "Nur Text (*.txt)");
Wenn ich dann beim getSaveFileName Dialog einen Namen eingebe und dann auf Speichern klicke, passiert eben nichts.

Vom Methodenname her, verstehe ich dass es wirklich eine simple Get-Methode ist.
Wie kann ich aber nun diese Datei, inkl. Pfad auch wirklich abspeichern lassen (resp. erstellen lassen) beim klicken auf Speichern?

Sorry für diese dumme Frage... aber wahrscheinlich ist meine Frage so dumm, dass noch niemand diese Frage gestellt hat (Suchen innerhalb des Forums sowie auf Google haben zu keinem Resultat gebracht...) :-)

Vielen Dank!

Gruss,
TheDON
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich würde es einfach mal damit probieren, die Datei mit dem zurückgegebenen Dateinamen zu öffnen/ zu erstellen (QFile) und die Daten reinzuschreiben.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

QString file = QFileDialog::getSaveFileName

gibt nur den filenamen .....

hinein schreiben muss man anders ....
etwa so....

Code: Alles auswählen

bool file_put_contents(QString fullFileName,QString xml)
{
    QString data = xml;
    QFile f( fullFileName );
	if ( f.open( QFile::WriteOnly | QFile::Text ) )
	{
		QTextStream sw( &f );
		sw << data;
		f.close();
		return true;
	}
	return false;
    
}
TheDON
Beiträge: 21
Registriert: 18. April 2006 22:25

Beitrag von TheDON »

Ja, habe in der Qt Library auch dieses Beispiel gefunden:

Code: Alles auswählen

        QFile file("out.txt");
        if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
            return;

        QTextStream out(&file);
        out << "The magic number is: " << 49 << "\n";
        out.close();
Ich werde das probieren und gebe dann bescheid!
Vielen Dank! :-)
TheDON
Beiträge: 21
Registriert: 18. April 2006 22:25

Beitrag von TheDON »

Hallo Jungs!

Danke hat bestens geklappt!!! :D

Das Ganze sieht nun so aus:

Code: Alles auswählen

	QFileDialog filedialog;
	QFile file = filedialog.getSaveFileName(
                    0,
					"Diktionär erstellen unter:",
					"C:",
					"Nur Text (*.txt)", &filedialog.selectedFilter());
					
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
            return;

        QTextStream out(&file);
        file.close(); 
Was nun nicht geht, ist die Methode &filedialog.selectedFilter()

Hat jemand eine Ahnung was das falsch ist??

Kurz gesagt, es wird die Endung nicht automatisch mitgespeichert, ausser wenn der User die Endung im Dateinamen explizit angibt z.B. "Test.txt"

Weiss jemand wo der Hund begraben ist??

Danke!!

Tschüss,
TheDON
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

das musst du wirklich selber schreiben.... qt kann nicht alles abnehmen..
denken mussen wir immer noch....


if (!exporttofile.endsWith(".sql")) {
exporttofile = exporttofile+".sql";
}

Code: Alles auswählen

   if (choise == "sql") {
        exporttofile = SaveAsFile("PlainText (*.sql)");
        if (exporttofile.size() > 3) {
              if (!exporttofile.endsWith(".sql")) {
                 exporttofile = exporttofile+".sql"; 
               }
               ok = PrepareDump( exporttofile );
               if (!ok) { msgb->information( this , "File Error!","Not possibel to save on file.."+errormsg); }
        }
     }

Code: Alles auswählen

/* function den file speichern.... */
QString Gui_Main::SaveAsFile(QString extension)
{
 QString s = QFileDialog::getSaveFileName(this,tr("Choose a filename to save under"),GetLastDirOpen(),extension);
    if (s.size() > 0) {
     LastDirOpen = s.left(s.lastIndexOf("/"))+"/";
     return s;
    } else {
     return "";
    }
}

/*  function den letzten geoffneten ordner wieder oeffnen...*/
QString Gui_Main::GetLastDirOpen()
{
  if (LastDirOpen.size() > 0) {
      return LastDirOpen;  /* in der class abspeichern !!! */
    }
   /*  im file gespeichert vom vorher... gebrauch.... */
   QString dirlas = file_get_contents(LASTDIROPENACTION);
    QDir dir(dirlas);
    if (dir.isAbsolute()) {
     return dirlas;   
    }
    return  QString(QDir::homePath());  
}


du speicherst sicher noch viele male ein file ....

dann mache doch eine funktion daraus....
TheDON
Beiträge: 21
Registriert: 18. April 2006 22:25

Beitrag von TheDON »

Hallo Patrik!
Vielen Dank für deinen Beitrag.

..aber schaue Mal die Parameterliste der Methode getSaveFileName an:

QString getSaveFileName ( QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString & filter = QString(), QString * selectedFilter = 0, Options options = 0 )

Wie du sehen kannst, gibt es einen Parameter *selectedFilter den man verwenden kann....

Ausserdem gibt es noch eine Methode selectedFilter(). Die Doku sagt:

QString QFileDialog::selectedFilter () const
Returns the filter that the user selected in the file dialog.


Dies bedeutet, dass das Anhängen der Endung eigentlich, mit Hilfe dieser Methode, automatisch geschehen sollte...

Oder liege ich da komplett falsch? :-)

Von deinem Code sehe ich die Verwendung dieser Methode eben gar nicht...

Danke!!

Gruss,
TheDON
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

beim oeffnen sicherlich ... es werden nur die sichtbar mit filter .txt . doc ecc..
die angegeben sind... doch beim speichern saveas ... den file namen gibt der user an... wie der file heissen soll... und nicht alle schreiben die extension dabei.... es sind nur 2 zeilen

if (!exporttofile.endsWith(".txt")) { exporttofile = exporttofile+".txt"; }

eine nachkontrolle ob die extension richtig ist... da auf window die richtige extension passend zu einem programm gemacht ist...

probiere mal mit der demo
qt4\demos\textedit\release einen neuen file zu machen und speichern unter ... wenn du "eeeee" schreibst ... bleibt er so.. ist dass richtig? obwohl .html angegeben ist...
newhappy
Beiträge: 13
Registriert: 11. Mai 2006 07:48
Kontaktdaten:

Beitrag von newhappy »

Können Sie auf die Projekt bauen?
Ich denke, dass "C:\" nicht gut ist.
Ändern Sie mit "C:\\".

Ich komme aus China Shanghai und Meine Deutsch ist nicht gut.
iaby
Beiträge: 53
Registriert: 10. Februar 2007 13:12

Beitrag von iaby »

Die Diskussion ist zwar schon alt, aber ich wärme sie mal wieder auf da es hier sehr gut passt!

Ich arbeite unter Linux mit Qt 4.3.2
Beim SaveDialog wird die Dateiendung nicht automatisch angehängt! Wenn ich also "test" in das Feld eingebe und als Filter ist "Text Files (*.txt)" selektiert, dann speichere, erstellt er mir nur die Datei "test", nicht wie aber erwünscht "test.txt".
Der Rückgabewert der Funktion selectedFilter() ist bei mir immer der letzte Eintrag im Filter, bei mir also "All Files (*)" !
Wieso ist das so? Mach ich was falsch?
Selbst wenn er mir den richtigen Filter zurückgeben würde hätte ich damit ein Problem, denn wenn es bereits eine Datei "test.txt" gibt und ich eine neue Datei als "test" + automatische Dateierweiterung speichern will, dann kommt keine Abfrage des Dialogs ob die Datei überschrieben werden soll, da ich ja dann erst im Nachhinein das ".txt" anhänge !?!

Kann mir jemand helfen?

Viele Grüße,
iaby
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Wobei brauchst Du Hilfe? Wie man die Existenz einer Datei abfragt, mit Warndialog und eventuellem Rücksprung zum Filedialog, kann es doch wohl nicht sein.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
iaby
Beiträge: 53
Registriert: 10. Februar 2007 13:12

Beitrag von iaby »

iaby hat geschrieben:Beim SaveDialog wird die Dateiendung nicht automatisch angehängt!
...
Der Rückgabewert der Funktion selectedFilter() ist bei mir immer der letzte Eintrag im Filter, bei mir also "All Files (*)" !
Das ist mein Problem!

Das mit dem Rücksprung zum SaveDialog funktioniert nur sauber, wenn ich auch wirklich weiß wie die Datei heißen soll. Ansonsten kann es vorkommen das der SaveDialog selbst abfrägt ob überschrieben werden soll und ich danach nochmal abfrage!
Deshalb soll er das eben einfach alles selbst machen. Wenn ich einen Teil mach und er einen Teil dann ist das für mich ein übler Workaround!

Zudem verhält es sich dann noch von Qt Version zu Qt Version anders mit dem Verhalten des Dialogs. Zumindest hab ich das in Erinnerung. Werde heut abend nochmal mit 4.1 und 4.2 gegentesten.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ist das wirklich das Default-Verhalten des normalen Windows Save-As - Dialogs dass die Extension autmatisch angehängt wird? Ich glaube nicht.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
iaby
Beiträge: 53
Registriert: 10. Februar 2007 13:12

Beitrag von iaby »

Doch auf alle Fälle!
Probier es doch kurz aus, oder hast du kein Windows (worum ich dich sehr beneiden würde ;) ).
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Windows habe ich - auch. Alles dual-boot

Da Qt den native Windows-Dialog aufruft (zumindest wenn man die static-Versionen von QFileDialog benutzt) finde ich das etwas komisch. Müsste man mal testen :)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten