Как сериализовать и десериализовать форматированный текст в QTextEdit? - PullRequest
3 голосов
/ 09 декабря 2010

Скажем, у меня есть такая структура:

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 в файл.

Теперь вопрос.Как определить операторы QDataStream для класса BBB, чтобы сериализовать объект BBB (int, QString и QTextEdit доходят до текстового содержимого ) при вызове out << AAA_object; </strong> ???

Ответы [ 3 ]

2 голосов
/ 10 декабря 2010

QTextEdit - это виджет, и нет смысла записывать виджет в файл, но мы можем записать содержимое виджета (QTextEdit :: toHtml ()) в файл. При чтении из файла мы можем создать новый объект виджета и инициализировать его содержимым файла (QTextEdit :: setHtml ()).

Я должен добавить, что, вероятно, было бы лучше разработать для хранения только BB-данные в формате BBB (в виде html QString), а не сам QTextEdit.

1 голос
/ 12 декабря 2010

Я уже выполнил это задание.Я сохранил изображения в 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);

Работает отлично!И у меня будет мой прежний рейтинг:)))!

0 голосов
/ 10 декабря 2010

Вот что я бы сделал:

Во-первых (как сказал руп), вы должны хранить не сам виджет QTextEdit, а текстовый документ (QTextDocument). Вы можете получить его из виджета QTextEdit с помощью QTextEdit :: document () .

QTextDocument* pTextDoc = m_textEdit->document();

Затем я получу строку html из этого документа и из этой строки получу QByteArray:

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

Получив объект QByteArray, содержащий документ, вы можете использовать операторы << </a> и >> .

Для чтения обратно QByteArray, сохраните его в QString (см. QString :: fromUtf8 () ) и используйте QTextDocument :: setHtml () для отображения содержимое в виджет QTextEdit.

UPDATE

После комментария jpalecek я слишком усложняю решение. Если у вас есть QString, содержащий текстовый документ в виде HTML, вы можете использовать QString :: operator << () </a> и QString :: operator >> () без использования QByteArray.

...