Wie serialisiert und deserialisiert Rich-Text in QTextEdit?
-
25-09-2019 - |
Frage
sagen, ich habe eine Struktur wie folgt aus:
class AAA
{
BBB bb_member;
double dbl_member;
....................
}
class BBB
{
int int_member;
QString QStr_member;
.................
QTextEdit m_textEdit;
}
Und für AAA definiere ich diese Operatoren:
QDataStream &operator<<(QDataStream &out, const AAA &aa)
{
out << aa.bb_member
<< aa.dbl_member;
return out;
}
QDataStream &operator>>(QDataStream &in, AAA &aa)
{
BBB bb_memb;
double dbk_memb;
in >> bb_memb
>> dbk_memb;
aa = AAA(bb_memb, dbk_memb);
return in;
}
Dann ist dies nenne ich:
QFile file("myFileName");
file.open(QIODevice::WriteOnly))
QDataStream out(&file);
out << AAA_object;
, um serialize AAA-Objekt in eine Datei.
Nun ist die Frage. Wie soll ich QDataStream Betreiber für BBB-Klasse, um zu serialisiert BBB Objekt (int, QString und QTextEdit Reichweite Textinhalt ), während Aufruf out << AAA_object definieren; ???
Lösung 2
Ich habe bereits diese Aufgabe compleated. Ich habe die Bilder in einem QVector gespeichert. den Vektor und den HTML-Code serialisiert. Dann deserialisiert den Code und den QVector. Hinzugefügt alle Bilder als Ressource mit dieser Funktion:
for(int i = 0; i < vectorOfImages.size(); i++ )
{
QUrl url(QString("image_%1").arg(i));
textEdit->document()->addResource(QTextDocument::ImageResource, url, vectorOfImages.at(i));
}
Dann führt die folgende
int count = 0;
int pos = 0;
QRegExp rx("<img src=\".+/>");
while ((pos = rx.indexIn(htmlCode, pos)) != -1)
{
QString strToReplace(QString("<img src=\"image_%1\" />").arg(count));
htmlCode.replace(pos, rx.matchedLength(), strToReplace);
pos += rx.matchedLength();
count++;
}
textEdit->setText(htmlCode);
Works fine! Und ich werde meine frühere Bewertung haben:)))
Andere Tipps
QTextEdit ist ein Widget, und es funktioniert nicht viel Sinn machen, ein Widget in eine Datei zu schreiben, aber wir können den Inhalt des Widgets (QTextEdit :: toHtml ()) in die Datei schreiben. Wenn aus einer Datei lesen, können wir ein neues Widget-Objekt erstellen und initialisieren es mit dem Inhalt der Datei (QTextEdit :: setHtml ()).
Ich muss hinzufügen, dass es wahrscheinlich ein besseres Design nur die rich Daten in BBB speichern würde (als html QString) in Bezug auf die QTextEdit selbst gegenüber.
Hier ist, was ich tun würde:
Erste (wie roop sagte), sollten Sie die QTextEdit
nicht speichern Widget selbst, sondern das zugrunde liegende Textdokument (QTextDocument
). Sie können es aus dem QTextEdit
Widget erhalten mit QTextEdit :: document () .
QTextDocument* pTextDoc = m_textEdit->document();
Dann würde ich die HTML-Zeichenfolge aus diesem Dokument erhalten und aus dieser Zeichenfolge, erhalte eine QByteArray
:
QString MyText = pTextDoc->toHtml();
QByteArray TextAsByteArray = MyText.toUtf8();
Wenn Sie ein QByteArray
Objekt mit Ihrem Dokument haben, können Sie die >> Betreiber.
Für die QByteArray
Lesen zurück, speichern Sie es in eine QString
(siehe QString :: fromUtf8 ( )), und verwenden Sie QTextDocument :: setHtml () Anzeige der Inhalt in das QTextEdit
Widget.
UPDATE
Nach jpalecek Kommentar, ich bin overcomplicating die Lösung. Sobald Sie eine QString
mit Ihrem Textdokument als HTML haben, können Sie QString :: operator << () und QString: :. Operator >> () ohne QByteArray
mit