Probleme mit QTextEdit und QMargin
-
Moin alle zusammen!
Ich habe leider ein größeres Problem, aber ich denke, dass wir das hinbekommen.Zuerst einmal die Beschreibung:
Ich entwickle gerade einen TextEditor mit QTextEdit. Und dieser soll QMargin, PageSize (A4,A5, etc.) und die Position von PageNumber (oben mittig, unten link, etc.) mit in einer .htm Datei speichern. In dieser .htm Datei wird auch der Content vom QTextEdit gespeichert. Soweit alles klar?
PageSize, PageNumber werden in einer extra Datei namens "PagesTextEdit.cpp" definiert. Denn diese Datei speichert und lädt das Dokument. Nun habe ich 2 Funktionen eingebaut: SaveExtra(); und LoadExtra();SaveExtra:
void PagesTextEdit::SaveExtra(QDataStream& out ) { QMarginsF t = m_pageMetrics.mmPageMargins(); out << t; out << m_pageMetrics.mmPageSize().height(); out << m_pageMetrics.mmPageSize().width(); };
In dieser Funktion wieder schon versucht, QMargin zu speichern, klappt auch super. Zusätzlich soll hier aber auch noch PageSize und PageNumber (Position) gespeichert werden.
LoadExtra:
void PagesTextEdit::LoadExtra(QDataStream& in ) { QMarginsF PageMargin; in >> PageMargin; setPageMargins(PageMargin); QMarginsF t; int pageheight; int pagewidth; in >> t; in >> pageheight; in >> pagewidth; m_pageMetrics.m_mmPageMargins = t; m_pageMetrics.m_mmPageSize = QSize(pagewidth, pageheight); };
Hier wird QMargin geladen. Das Problem ist, dass zwar das Margin stimmt, aber kein Inhalt, wie Texte oder BIlder angezeigt werden. AUch hier soll zusätzlich noch PageSize und PageNumber (Position) gespeichert werden.
Speicher-Funktion:
void PagesTextEdit::saveUnderDocument() { if (fileName.isEmpty()) { fileName = QFileDialog::getSaveFileName(this, tr("Speichern unter..."), QString("Dokument.htm"), tr("TextPad 1.0 (*.htm);;")); QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation); if (fileName.isEmpty()) return; } QFile file(fileName, this); if (!file.open(QIODevice::WriteOnly)) { qDebug() << "Fehler beim Speichern der Datei"; } QProgressDialog progress("Speichern - Fortschritt", "Abbrechen", 0, 10); progress.setWindowTitle("Speichern"); progress.setWindowIcon(QIcon(":/ic_save_black_24dp.png")); progress.show(); for (int i = 0; i < 10; i++) { progress.setValue(i); if (progress.wasCanceled()) break; QTime saveTime = QTime::currentTime().addMSecs(40); while (QTime::currentTime() < saveTime) QCoreApplication::processEvents(QEventLoop::AllEvents, 100); } progress.setValue(1); QDataStream out(&file); SaveExtra(out); out << encodeHtml(toHtml()); file.close(); }
SaveExtra(out), deswegen SaveExtra...
Öffnen-Funktion:
void PagesTextEdit::loadDocument() { QString fileName = QFileDialog::getOpenFileName(this, tr("Öffnen..."), QString(), tr("TextPad 1.0 (*.htm);;")); if (fileName.isEmpty()) return; QFile file(fileName, this); if (!file.open(QIODevice::ReadOnly)) { qDebug() << "Fehler beim Öffnen der Datei"; return; } QProgressDialog progress("Öffnen - Fortschritt", "Abbrechen", 0, 10); progress.setWindowTitle("Öffnen"); progress.setWindowIcon(QIcon(":/ic_folder_open_black_24dp_1x.png")); progress.show(); for (int i = 0; i < 10; i++) { progress.setValue(i); if (progress.wasCanceled()) break; QTime saveTime = QTime::currentTime().addMSecs(40); while (QTime::currentTime() < saveTime) QCoreApplication::processEvents(QEventLoop::AllEvents, 100); } progress.setValue(1); if (document()) { document()->clear(); } QString html; QDataStream in(&file); LoadExtra(in); in >> html; document()->setHtml(html); // file.readAll() file.close(); }
LoadExtra(in), deswegen LoadExtra...
Hier ist der Link zu meinem Projekt, um ein Verständnis zu bekommen, was sich auf wen bezieht und wo deklariert ist. Das ganze hier spielt sich in der Datei "PagesTextEdit.cpp" ab.
https://1drv.ms/f/s!AqaeHLtTIsoIhPkuv84DQOgVsHUISQIch bitte Euch, keinen Unfug mit dem Projekt zu machen :)
Ich hoffe, diese Informationen helfen.
LG
-
Kann denn keiner etwas dazu sagen?
-
Ich würde einfach mal schauen was in 'html' drin steht. Außerdem benutzt du beim Speichern noch 'encodeHtml()' - was auch immer das mit dem html anstellt.
Und was soll das ganze mit den 40ms Wartezeit?/edit: Und SaveExtra speichert 3 Werte, LoadExtra versucht hingegen 4 Werte zu laden...
-
Okay, und wie schaue ich in html rein?
-
Debugger, qDebug(), QMessageBox,, QPlaintTextEdit, Speichern in einer Datei und anschauen mit TextEditor.
Und wie ich schon sagte - beim Schreiben benutzt Du encodeHtml() - was auch immer diese Funktion macht. Beim Einlesen übergibst Du diesen String direkt an QTextEdit... -
QString encodeHtml(QString html) { html = html.replace("ä", "ä"); html = html.replace("Ä", "Ä"); html = html.replace("ö", "ö"); html = html.replace("Ö", "Ö"); html = html.replace("ü", "ü"); html = html.replace("Ü", "Ü"); html = html.replace("ß", "ß"); return html; }
Das ist encodeHtml
-
QTextEdit::toHtml() gibt schon gültiges HTML zurück - nicht nötig da noch einmal was zu konvertieren (was eh nicht mehr vorhanden ist). ß wird übrigens falsch konvertiert...