Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. German
  4. QTextEdit and QTextDocumentWriter
QtWS25 Last Chance

QTextEdit and QTextDocumentWriter

Scheduled Pinned Locked Moved German
8 Posts 2 Posters 5.8k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • T Offline
    T Offline
    ThomasJoachim
    wrote on last edited by
    #1

    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

    1 Reply Last reply
    0
    • G Offline
      G Offline
      goetz
      wrote on last edited by
      #2

      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?

      http://www.catb.org/~esr/faqs/smart-questions.html

      1 Reply Last reply
      0
      • T Offline
        T Offline
        ThomasJoachim
        wrote on last edited by
        #3

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

        Thanks

        1 Reply Last reply
        0
        • T Offline
          T Offline
          ThomasJoachim
          wrote on last edited by
          #4

          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);
          }
          

          @

          1 Reply Last reply
          0
          • G Offline
            G Offline
            goetz
            wrote on last edited by
            #5

            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.

            http://www.catb.org/~esr/faqs/smart-questions.html

            1 Reply Last reply
            0
            • T Offline
              T Offline
              ThomasJoachim
              wrote on last edited by
              #6

              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

              1 Reply Last reply
              0
              • G Offline
                G Offline
                goetz
                wrote on last edited by
                #7

                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.

                http://www.catb.org/~esr/faqs/smart-questions.html

                1 Reply Last reply
                0
                • T Offline
                  T Offline
                  ThomasJoachim
                  wrote on last edited by
                  #8

                  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.

                  1 Reply Last reply
                  0

                  • Login

                  • Login or register to search.
                  • First post
                    Last post
                  0
                  • Categories
                  • Recent
                  • Tags
                  • Popular
                  • Users
                  • Groups
                  • Search
                  • Get Qt Extensions
                  • Unsolved