0

をオーバーライドするQTextDocumentのサブクラスがあります。QTextDocument::loadResource(int type, const QUrl &name)

クローンしたい。

アイデア?

4

1 に答える 1

1

そのためには使えませんQTextDocument::clone。仮想ではないため、再実装することもできません。別の clone メソッドを作成し (名前をclone付けることもできますが、混乱を避けるために別の名前を付けます)、自分で複製を実装する必要があります。とを使用toHtmlsetHtmlて、あるオブジェクトから別のオブジェクトにコンテンツをコピーできます。

MyTextDocument* MyTextDocument::my_clone(QObject * parent = 0) {
  MyTextDocument* other = new MyTextDocument(parent);
  other->setHtml(toHtml());
  return other;
}

ただし、コピーする必要があるプロパティは他にも多数あります。QTextDocument::cloneメソッドの実装方法を参照してください。

QTextDocument *QTextDocument::clone(QObject *parent) const
{
    Q_D(const QTextDocument);
    QTextDocument *doc = new QTextDocument(parent);
    QTextCursor(doc).insertFragment(QTextDocumentFragment(this));
    doc->rootFrame()->setFrameFormat(rootFrame()->frameFormat());
    QTextDocumentPrivate *priv = doc->d_func();
    priv->title = d->title;
    priv->url = d->url;
    priv->pageSize = d->pageSize;
    priv->indentWidth = d->indentWidth;
    priv->defaultTextOption = d->defaultTextOption;
    priv->setDefaultFont(d->defaultFont());
    priv->resources = d->resources;
    priv->cachedResources.clear();
#ifndef QT_NO_CSSPARSER
    priv->defaultStyleSheet = d->defaultStyleSheet;
    priv->parsedDefaultStyleSheet = d->parsedDefaultStyleSheet;
#endif
    return doc;
}

これらのプロパティが重要な場合は、my_clone実装に手動でコピーする必要があります。QTextDocumentPrivateクラスは内部なので使用できます。したがって、デフォルトの実装をそのままコピーすることはできません。ただし、リストされている各プロパティを API で設定する通常の方法があります。

前方互換性の問題に注意してください。新しい Qt バージョンで新しいプロパティが表示された場合、実装はデフォルトのclone実装とは逆にそれらをコピーしません。これは問題になる可能性があるため、このアプローチは完全ではありません。

于 2013-08-03T23:02:23.450 に答える