我有一个覆盖QTextDocument的子类。QTextDocument::loadResource(int type, const QUrl &name)
我想克隆它。
想法?
我有一个覆盖QTextDocument的子类。QTextDocument::loadResource(int type, const QUrl &name)
我想克隆它。
想法?
你不能用QTextDocument::clone
那个。你也不能重新实现它,因为它不是虚拟的。您应该创建另一个克隆方法(您可以命名它,clone
但我会给它另一个名称以避免混淆)并自己实现克隆。您可以使用toHtml
andsetHtml
将内容从一个对象复制到另一个对象:
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
实现相反的位置。这可能是一个问题,因此这种方法并不完美。