说我有这样的结构:
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; ???
答案 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
。