3

次のような構造があるとします。

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 オブジェクトをファイルにシリアライズするため。

今質問です。<< AAA_object;を呼び出すときに、BBB オブジェクト (int、QString、およびQTextEdit がテキスト コンテンツに到達)をシリアル化するために、BBB クラスの QDataStream 演算子を定義する方法を教えてください。???

4

3 に答える 3

2

QTextEdit はウィジェットであり、ウィジェットをファイルに書き込むことはあまり意味がありませんが、ウィジェットの内容 (QTextEdit::toHtml()) をファイルに書き込むことができます。ファイルから読み取る場合、新しいウィジェット オブジェクトを作成し、ファイルの内容で初期化できます (QTextEdit::setHtml())。

QTextEdit 自体ではなく、リッチテキスト データのみを BBB に (html QString として) 格納する方が、おそらくより良い設計であると付け加える必要があります。

于 2010-12-10T07:55:24.343 に答える
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);

正常に動作します!そして、私は以前の評価を取得します:)))!

于 2010-12-11T23:13:08.213 に答える
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::fromUtf8()QStringを参照) に格納し、 QTextDocument::setHtml()を使用してコンテンツをウィジェットに表示します。QTextEdit

アップデート

jpalecek のコメントに続いて、私は解決策を過度に複雑にしています。QStringテキスト ドキュメントを HTML として含む取得たら、.QByteArray

于 2010-12-10T08:33:32.143 に答える