Como serializar e desserializar texto rico no Qtextedit?
-
25-09-2019 - |
Pergunta
Diga que tenho uma estrutura como esta:
class AAA
{
BBB bb_member;
double dbl_member;
....................
}
class BBB
{
int int_member;
QString QStr_member;
.................
QTextEdit m_textEdit;
}
E para AAA eu defino esses operadores:
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;
}
Então eu chamo isso:
QFile file("myFileName");
file.open(QIODevice::WriteOnly))
QDataStream out(&file);
out << AAA_object;
Para serializar serializar o objeto AAA a um arquivo.
Agora a pergunta. Como devo definir os operadores Qdatastream para a classe BBB para serializar serializar o objeto BBB (int, qString e Qtextedit alcance conteúdo de texto), enquanto liga out << aaa_object; ???
Solução 2
Eu já completei essa tarefa. Eu salvei as imagens em um qvetor. Serializou o vetor e o código HTML. Em seguida, desserializou o código e o qvetor. Adicionado todas as imagens como um recurso com esta função:
for(int i = 0; i < vectorOfImages.size(); i++ )
{
QUrl url(QString("image_%1").arg(i));
textEdit->document()->addResource(QTextDocument::ImageResource, url, vectorOfImages.at(i));
}
Então faz o seguinte
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);
Funciona bem! E eu terei minha classificação anterior :)))!
Outras dicas
O QTEXTEDIT é um widget e não faz muito sentido escrever um widget em um arquivo, mas podemos escrever o conteúdo do widget (Qtextedit :: tohtml ()) no arquivo. Ao ler a partir do arquivo, podemos criar um novo objeto de widget e inicializá -lo com o conteúdo do arquivo (qtextedit :: sethtml ()).
Devo acrescentar que provavelmente seria um design melhor armazenar apenas os dados RichText no BBB (como um HTML QString) em oposição ao próprio Qtextedit.
Aqui está o que eu faria:
Primeiro (como Roop disse), você não deve armazenar o QTextEdit
próprio widget, mas o documento de texto subjacente (QTextDocument
). Você pode obtê -lo do QTextEdit
widget com Qtextedit :: document ().
QTextDocument* pTextDoc = m_textEdit->document();
Então, eu recebia a string html deste documento e desta string, obtenha um QByteArray
:
QString MyText = pTextDoc->toHtml();
QByteArray TextAsByteArray = MyText.toUtf8();
Depois de ter um QByteArray
Objeto que contém seu documento, você pode usar o << e >> operadores.
Para ler de volta o QByteArray
, armazene -o em um QString
(Vejo QSTRING :: Fromutf8 ()), E use QtextDocument :: sethtml () Para exibir o conteúdo no QTextEdit
ferramenta.
ATUALIZAR
Após o comentário do JPalecek, estou supercomplicando a solução. Depois de ter um QString
contendo seu documento de texto como HTML, você pode usar QString :: Operator << () e QString :: Operator >> () sem usar um QByteArray
.