【问题标题】:How to serialize and deserialize rich text in QTextEdit?如何在 QTextEdit 中序列化和反序列化富文本?
【发布时间】:2010-12-09 20:00:51
【问题描述】:

假设我有这样的结构:

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 ???

【问题讨论】:

  • 呃,你说的是“富文本”,对吧?
  • 是的,对不起,我会改正的。

标签: c++ qt serialization text qtextedit


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我已经完成了这项任务。我已将图像保存在 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);
    

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

    【讨论】:

      【解决方案3】:

      这是我要做的:

      首先(正如 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

      【讨论】:

      • 如果 QString 有操作符,为什么不直接将 QString 存储在 QDataStream 中
      • @jpalecek:你说得对,我太复杂了!我会更新我的答案。
      • 所有这些我也在论坛上读到过。但我担心我是否会存储 qtextedit 中的图像。一般来说,这里的问题也是加载和重新加载图像。
      • @Narek:你试过用图片解决这个问题吗?担心是不够的,你必须测试,检查什么是有效的,什么是无效的!然后,根据您面临的具体问题,提出更具体的问题。
      • 好的,我知道你确信这应该可以工作。我会尝试。但很明显,有一些事情需要担心。因为在 HTML 代码中没有图像文件。只有该文件的实例化。所以我想知道我是否不会丢失图片,而只检索 HTML 代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 2013-03-01
      • 2012-12-19
      • 1970-01-01
      • 2012-03-17
      相关资源
      最近更新 更多