[Qt] Datei Ein- und Ausgabe



  • Zum Einstieg in Qt bin ich gerade dabei, einen einfachen Text-Editor zu schreiben. Mein Central-Widget habe ich von QPlainTextEdit abgeleitet und soweit funktioniert das auch schon ganz gut. Bei Dateien ohne Sonderzeichen (einfache .txt, .log usw.) geht alles problemlos.

    Wenn ich z.B. ein Bild darin öffne, kommt logischerweise nur Kauderwelsch raus. Kein Problem soweit. Aber wenn ich diese Datei dann nochmal - ohne eine Veränderung abspeichere, sind die Newlines und einige Zeichen anders gesetzt, und das Bild somit kaputt. Mache ich das mit einem anderen Editor, funktioniert das Bild noch.

    Ist es mit Qt denn möglich, die Bytes 1:1 zu übertragen?

    Zur Zeit benutze ich diese Funktionen zum Laden und Speichern von Dateien (TextEdit ist von QPlainTextEdit abgeleitet):

    bool TextEdit::readFile(const QString &fileName)
    {
        QFile file(fileName);
        file.open(QIODevice::ReadOnly | QIODevice::Text);
    
        clear();
    
        QString buffer;
        QTextStream in(&file);
        while (!in.atEnd()) {
            in >> buffer;
            appendPlainText(buffer);
        }
        return true;
    }
    
    bool TextEdit::writeFile(const QString &fileName)
    {
        QFile file(fileName);
        file.open(QIODevice::WriteOnly | QIODevice::Text);
    
        QTextStream out(&file);
        out << toPlainText();
        return true;
    }
    

    Anstelle von QTextStream habe ich schon QDataStream und gleich QFile::read() bzw. QFile::write() versucht, doch das gespeicherte ist immer etwas verändert.



  • Gut, ich habe jetzt herausgefunden, dass das wohl größtenteils an der Kodierung liegt. Deswegen wollte ich, dass der Editor erkennt, ob es sich da um ANSI, UTF-8 oder UTF-16 handelt - und dann den entsprechenden Text in das QPlainTextEdit schreiben.

    Ich weiß, dass man das ohne eine Kennzeichnung nicht erkennen kann. Aber da Qt doch so eine angeprägte String-Klasse hat, gibt es da vielleicht eine Möglichkeit, Qt entscheiden zu lassen, was da gerade vorliegt? Aufgefallen ist mir QTextStream::setAutoDetectUnicode(), nur weiß ich leider nicht, wie ich es benutzen soll.

    Wie kann ich dem QPlainTextEdit jetzt den "richtigen" Text mitgeben? Öffne ich z.B. ein UTF-8 File, steht ganz am Anfang "", BOM wenn ich mich nicht täusche?


Anmelden zum Antworten