Как сериализовать и десериализовать форматированный текст в QTextEdit?
Скажем, у меня есть такая структура:
class AAA
{
BBB bb_member;
double dbl_member;
....................
}
class BBB
{
int int_member;
QString QStr_member;
.................
QTextEdit m_textEdit;
}
А для ААА я определяю эти операторы:
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 в файл.
Теперь вопрос. Как определить операторы QDataStream для класса BBB, чтобы сериализовать объект BBB (int, QString и QTextEdit доходят до текстового содержимого), вызывая << AAA_object;???
3 ответа
Я уже выполнил эту задачу. Я сохранил изображения в 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);
Работает отлично! И у меня будет мой прежний рейтинг:)))!
QTextEdit является виджетом, и нет смысла записывать виджет в файл, но мы можем записать содержимое виджета (QTextEdit::toHtml()) в файл. При чтении из файла мы можем создать новый объект виджета и инициализировать его содержимым файла (QTextEdit::setHtml()).
Я должен добавить, что, вероятно, было бы лучше разработать для хранения только BB-данные в формате BBB (в виде html QString), а не сам QTextEdit.
Вот что я бы сделал:
Во-первых (как сказал руп), вы не должны хранить 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
виджет.
ОБНОВИТЬ
После комментария jpalecek я слишком усложняю решение. Когда у вас есть QString
содержащий текстовый документ в виде HTML, вы можете использовать QString:: operator<< () и QString:: operator >> () без использования QByteArray
,