2010-12-09 13 views
3

sagen, dass ich eine Struktur wie dieses:Wie serialisieren und deserialisieren Rich Text in QTextEdit?

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 rufe ich dies:

QFile file("myFileName"); 
file.open(QIODevice::WriteOnly)) 
QDataStream out(&file); 
out << AAA_object; 

um AAA-Objekt zu serialisiert zu einer Datei.

Jetzt die Frage. Wie ich QDataStream-Operatoren für BBB-Klasse definieren sollte, um BBB-Objekt (Int, QString und QTextEdit erreichen Textinhalt) serialisieren, während < < < aufrufen AAA_object; ???

+0

du sprichst von "RICH text", richtig? – rsenna

+0

Ja, tut mir leid, ich werde es korrigieren. – Narek

Antwort

1

Ich habe diese Aufgabe bereits abgeschlossen. Ich habe die Bilder in einem QVector gespeichert. Serialisiert den Vektor und den HTML-Code. Dann deserialisiert der Code und der 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 folgenden

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

funktioniert gut! Und ich werde meine frühere Bewertung haben :)))!

2

QTextEdit ist ein Widget, und es macht nicht viel Sinn, ein Widget in eine Datei zu schreiben, aber wir können den Inhalt des Widgets (QTextEdit :: toHtml()) in die Datei schreiben. Beim Lesen einer Datei können wir ein neues Widget-Objekt erstellen und es mit dem Inhalt der Datei initialisieren (QTextEdit :: setHtml()).

Ich muss hinzufügen, dass es wahrscheinlich ein besseres Design wäre, nur die Richtextdaten in BBB (als HTML-QString) im Gegensatz zu QTextEdit selbst zu speichern.

0

Hier ist, was ich tun würde:

First (als roop sagte), sollten Sie nicht speichern die QTextEdit Widget selbst, sondern das zugrunde liegende Textdokument (QTextDocument). Sie können es von QTextEdit Widget mit QTextEdit::document() bekommen.

QTextDocument* pTextDoc = m_textEdit->document(); 

Dann würde ich die HTML-Zeichenfolge aus diesem Dokument erhalten und aus dieser Zeichenfolge, erhalten eine QByteArray:

QString MyText = pTextDoc->toHtml(); 
QByteArray TextAsByteArray = MyText.toUtf8(); 

Sobald Sie ein QByteArray Objekt mit Ihrem Dokument haben, können Sie die << verwenden und >> Betreiber.

Für die QByteArray Lesen zurück, speichern Sie es in ein QString (siehe QString::fromUtf8()) und QTextDocument::setHtml() verwenden Sie den Inhalt in das QTextEdit Widget anzuzeigen.

UPDATE

jpalecek Kommentar Folgen, ich overcomplicating die Lösung. Sobald Sie eine QString haben, die Ihr Textdokument als HTML enthält, können Sie QString::operator<<() und QString::operator>>() verwenden, ohne eine QByteArray zu verwenden.

+0

Warum QString nicht direkt im QDataStream speichern, wenn es Operator << hat? – jpalecek

+0

@jpalecek: Du hast Recht, ich bin zu kompliziert! Ich werde meine Antwort aktualisieren. –

+0

All das habe ich auch in Foren gelesen. Aber ich mache mir Sorgen, wenn ich Bilder speichern werde, die im qtextedit sind. Im Allgemeinen besteht das Problem darin, Bilder zu laden und neu zu laden. – Narek

Verwandte Themen