2010-12-09 62 views
3

說我有這樣的結構:如何序列化和反序列化QTextEdit中的富文本?

class AAA 
{ 
    BBB  bb_member; 
    double dbl_member; 
    .................... 
} 

class BBB 
{ 
    int    int_member; 
    QString   QStr_member; 

    ................. 
    QTextEdit  m_textEdit; 
} 

而對於AAA我定義這個運營商:以串行AAA對象

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

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

然後我把這個到一個文件。

現在的問題。如何爲BBB類定義QDataStream運算符以便序列化BBB對象(int,QString和QTextEdit達到文本內容),同時調用out < < AAA_object; ???

+0

uhn你說的是「RICH text」,對不對? – rsenna 2010-12-09 20:07:00

+0

是的,對不起,我會糾正它。 – Narek 2010-12-09 20:12:34

回答

1

我已完成此任務。我已將圖像保存在QVector中。序列化矢量和HTML代碼。然後反序列化代碼和QVector。添加完所有圖像作爲資源使用此項功能:

for(int i = 0; i < vectorOfImages.size(); i++) 
{ 
    QUrl url(QString("image_%1").arg(i)); 
    textEdit->document()->addResource(QTextDocument::ImageResource, url, vectorOfImages.at(i)); 
} 

然後執行以下操作

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

工作正常!我會得到我以前的評價:)))!

2

的QTextEdit是一個小部件,而它沒有太大的意義寫一個窗口小部件,文件,但我們可以寫微件(的QTextEdit :: toHtml()),該文件的內容。從文件讀取時,我們可以創建一個新的窗口小部件對象,並用文件內容(QTextEdit :: setHtml())對其進行初始化。

我必須補充,這可能會是一個更好的設計來存儲剛剛在BBB的富文本數據(作爲HTML的QString),而不是在自己的QTextEdit。

0

這裏是我會做什麼:

首先(如魯普說),你不應該存儲QTextEdit小部件本身,但潛在的文本文檔(QTextDocument)。你可以從QTextEdit小工具中獲得它QTextEdit::document()

QTextDocument* pTextDoc = m_textEdit->document(); 

然後,我就從這個文件中獲取HTML字符串和從該字符串,得到了QByteArray

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

一旦您擁有一個包含文檔QByteArray對象,你可以使用<<>>經營者。

對於讀回QByteArray,將其存儲到一個QString(參見QString::fromUtf8()),並使用QTextDocument::setHtml()顯示內容進QTextEdit插件。

UPDATE

繼jpalecek評論,我對過於複雜的解決方案。一旦你有一個包含QString文本文檔HTML,您可以使用QString::operator<<()QString::operator>>()不使用QByteArray