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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top