如何在QTextEdit中序列化和反序列化富文本?

时间:2010-12-09 20:00:52

标签: c++ qt serialization text qtextedit

说我有这样的结构:

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

class BBB
{
    int             int_member;
    QString         QStr_member;

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

对于AAA,我定义了这个运算符:

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

然后我称之为:

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

以便将AAA对象序列化为文件。

现在的问题。我应该如何定义BBB类的QDataStream运算符以序列化BBB对象(int,QString和 QTextEdit到达文本内容),同时调用 out&lt;&lt; AAA_object; ???

3 个答案:

答案 0 :(得分:2)

QTextEdit是一个小部件,将小部件写入文件没有多大意义,但我们可以将小部件的内容(QTextEdit :: toHtml())写入文件。从文件中读取时,我们可以创建一个新的窗口小部件对象,并使用该文件的内容对其进行初始化(QTextEdit :: setHtml())。

我必须补充一点,它可能是一个更好的设计,只存储BBB中的richtext数据(作为一个html QString)而不是QTextEdit本身。

答案 1 :(得分: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 :(得分:0)

以下是我要做的事情:

首先(正如roop所说),你不应该存储QTextEdit小部件本身,而是存储基础文本文档(QTextDocument)。您可以使用QTextEdit::document()QTextEdit小部件中获取它。

QTextDocument* pTextDoc = m_textEdit->document();

然后,我将从此文档中获取html字符串,并从此字符串中获取QByteArray

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

拥有包含文档的QByteArray对象后,您可以使用<<>>运算符。

要回读QByteArray,请将其存储到QString(请参阅QString::fromUtf8()),并使用QTextDocument::setHtml()将内容显示在QTextEdit窗口小部件中

<强>更新

根据jpalecek的评论,我对解决方案过于复杂。在您的文本文档包含HTML的QString后,您可以使用QString::operator<<()QString::operator>>()而无需使用QByteArray