QTextEdit and QTextDocumentWriter



  • Hello
    working with QTextEdit is very fine. Saving files is not so fine.

    A new line is always marked with a LineFeed (0x0A).
    For other software I need Carriage Return (0x0D) and LineFeed(0x0A).

    How can I configure QTextDocumentWriter to this for me?

    Thomas



  • Did you try to use a [[Doc:QFile]] opened with mode "QIODevice::Text":/doc/qt-4.8/qiodevice.html#OpenModeFlag-enum and pass its pointer to the QTextDocumentWriter constructor?



  • Hello,
    I have to check it this evening. What I found is, that the Carriage Returns are eliminated automatically.

    Thanks



  • Hallo Volker,
    Das ist der Code, den ich irgendwo gefunden und programmiert habe.
    Eigentlich brauche ich nur reine Text-Dateien (aber mir CR/LF) und eine entsprechende Prüfung, ob es tatsächlich ein reines Textfile ist.

    Vielen Dank

    @ if (!QFile::exists(f))
    return false;
    QFile file(f);
    if (!file.open(QFile::ReadOnly))
    return false;

    QByteArray data = file.readAll();
    QTextCodec *codec = Qt::codecForHtml(data);
    QString str = codec->toUnicode(data);
    if (Qt::mightBeRichText(str)) {
        textEdit->setHtml(str);
    } else {
        str = QString::fromLocal8Bit(data);
        textEdit->setPlainText(str);
    }
    

    @



  • Hm, ich würde sagen, das geht nicht mit Qt Bordmitteln direkt. Ob es sich um HTML oder plain text handelt, kann man mit mightBeRichText herausfinden.

    Wenn Du rausfinden willst, ob die Zeilenenden passen, würde ich den Dateiinhalt in ein [[Doc:QByteArray]] einlesen (zumindest die ersten paar Kilobyte). Dann nach der ersten Position eines newlines (LF) suchen und schauen, ob das Byte davor ein CR ist.

    Ist vielleicht nicht wirklich effektiv, elegant ist sicher auch anders, aber sollte funktionieren.



  • Wenn dann aber CR LF drin sind, sind die CR ja nach dem abspeichern weg, was der Anwendung, die die Dateien bekommen soll nicht gefällt.
    @
    QTextDocumentWriter writer(fileName);
    writer.setFormat("plaintext");
    success = writer.write(textEdit->document());
    @
    Warum auch immer das so ist. Schliesslich ist es MS-Windows und da war schon immer CR LF
    ?

    Gruss Thomas



  • Das einzige was mir dazu jetzt einfällt, wäre ein manuelles einlesen der Zeilen und wieder rausschreiben mit CRLF dran. So in etwa könnte ich mir das vorstellen:

    @
    QFile input("abc.txt");
    input.open(QIODevice::ReadOnly);

    QFile output("xyz.txt");
    output.open(QIODevice::WriteOnly);

    while(input.canReadLine()) {
    QByteArray line = input.readLine();
    // line.at(size-1) == LF
    // line.at(size-2) könnte ein CR sein
    // falls ja: nichts machen, die Zeile passt
    // falls nein: das LF durch ein CR tauschen und das LF anhängen
    int size = line.size();
    if(line.at(size-2) != '\r') {
    line[size-1] = '\r';
    line.append('\n');
    }
    output.write(line);
    }

    output.close();
    input.close();
    @

    Anstelle von QFile als input-device kannst Du auch einen [[Doc:QBuffer]] nehmen, in den Du einen QString stopfst.



  • Hallo Volker,
    Vielen Dank für den Hinweis.

    So ähnlich habe ich es nun gelöst.
    @ if (!QFile::exists(f))
    return false;
    QFile file(f);
    if (!file.open(QIODevice::Text | QFile::ReadOnly))
    return false;

    QByteArray data = file.readAll(); // --> hier waren schon alle CR verschwunden
    

    @

    Beim Rausschreiben folgt dann:
    @ QTextDocument *doc = textEdit->document();
    QString data = doc->toPlainText();
    QByteArray bytes;
    bytes.append(data);

      QFile outputFile(fileName);
      QFile::FileError err = outputFile.error();
    
      if (outputFile.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate))
      {
        outputFile.write(bytes); // das muss es wohl gewesen sein siehe untern **
        outputFile.close();
        success = true;
      }
    }
    

    @
    ** bei QFile stand da irgendwo in der Docu:
    The QIODevice::Text flag passed to open() tells Qt to convert Windows-style line terminators ("\r\n") into C++-style terminators ("\n")

    Das war dann auch so. Nach dem read waren alle verschwunden und kamen wieder nach dem write().
    Die ursprüngliche Lösung mit QTextDocumentWriter hat nicht funktioniert, da waren CR weg.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.