3

假设我有这样的结构:

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 到达文本内容),同时调用<< AAA_object; ???

4

3 回答 3

2

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

我必须补充一点,与 QTextEdit 本身相比,将富文本数据仅存储在 BBB 中(作为 html QString)可能是一个更好的设计。

于 2010-12-10T07:55:24.343 回答
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);

工作正常!我会得到我以前的评价:)))!

于 2010-12-11T23:13:08.213 回答
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 评论之后,我使解决方案过于复杂。一旦你有一个QString包含你的文本文档作为 HTML,你可以使用QString::operator<<()QString::operator>>()而不使用QByteArray.

于 2010-12-10T08:33:32.143 回答