Seite 1 von 2
Save File
Verfasst: 3. Mai 2006 23:44
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
Verfasst: 4. Mai 2006 06:11
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.
Verfasst: 4. Mai 2006 08:29
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;
}
Verfasst: 4. Mai 2006 09:43
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!

Verfasst: 5. Mai 2006 00:01
von TheDON
Hallo Jungs!
Danke hat bestens geklappt!!!
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
Verfasst: 5. Mai 2006 00:15
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....
Verfasst: 5. Mai 2006 12:52
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
Verfasst: 5. Mai 2006 15:58
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...
Verfasst: 11. Mai 2006 08:20
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.
Verfasst: 21. November 2007 18:19
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
Verfasst: 22. November 2007 07:46
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.
Verfasst: 22. November 2007 08:45
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.
Verfasst: 22. November 2007 08:52
von Christian81
Ist das wirklich das Default-Verhalten des normalen Windows Save-As - Dialogs dass die Extension autmatisch angehängt wird? Ich glaube nicht.
Verfasst: 22. November 2007 10:37
von iaby
Doch auf alle Fälle!
Probier es doch kurz aus, oder hast du kein Windows (worum ich dich sehr beneiden würde

).
Verfasst: 22. November 2007 10:40
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
