如何复制 QWebPage?
Posted
技术标签:
【中文标题】如何复制 QWebPage?【英文标题】:How do I copy the QWebPage? 【发布时间】:2015-09-07 07:28:13 【问题描述】:我想创建自己的自定义页面。这个类继承自QWebPage
。但是我想从existing instance
复制值来创建它,这样我就可以添加自己的方法,覆盖一些东西,然后用setPage()
用我的自定义页面替换当前页面。
问题是:QObject
复制构造函数似乎不起作用:
class webpage : public QWebPage
public:
//webpage(QObject* parent = 0);
webpage(QWebPage*);
void foo();
webpage::webpage(QWebPage *page)
: QWebPage(*page)
导致错误:
错误:C2248:'QObject::QObject':无法访问私有成员 在类“QObject”中声明
我的问题是:我该如何解决这个问题?我真正想要的是将page
参数对象复制到当前对象。
【问题讨论】:
您需要将什么样的数据从一个 QWebPage 实例复制到另一个实例?QObject
具有特殊设计,可禁用直接复制。您需要实现方法webpage * webpage::clone()
,它将提供具有必要逻辑的深层副本。
您应该提到,由于某种原因,它被设计禁用。请参阅下面的答案。
@vahancho:我想将对象的浅拷贝复制到 webpage::webpage(QWebPage *page)
构造函数中创建的对象
@SaZ:我不太明白,我要复制的对象是QWebPage
类型的setPage()
的返回值。我将如何在 QWebPage
类中创建 clone()
方法?
【参考方案1】:
修复您的代码:
class webpage : public QWebPage
Q_OBJECT
public:
//webpage(QObject* parent = 0);
webpage::webpage(QWebPage *page)
: QWebPage(page)
void foo();
;
QWebPage 的构造函数需要一个指针,但您取消了它的引用。这导致了您描述的错误。
QWebPage 派生自 QObject,这意味着它既没有复制构造函数,也没有赋值运算符。这是设计使然:
QObject 既没有复制构造函数也没有赋值运算符。 这是设计使然。实际上,它们是声明的,但是在私有的 带有宏 Q_DISABLE_COPY() 的部分。事实上,所有的 Qt 类 派生自 QObject(直接或间接)使用此宏声明 他们的复制构造函数和赋值运算符是私有的。这 在 Qt 上关于 Identity vs Value 的讨论中可以找到推理 对象模型页面。
主要的结果是你应该使用指向 QObject 的指针(或 您的 QObject 子类),否则您可能会想使用 您的 QObject 子类作为值。例如,没有副本 构造函数,不能使用 QObject 的子类作为值 存储在容器类之一中。您必须存储指针。
[http://doc.qt.io/qt-5/qobject.html#no-copy-constructor-or-assignment-operator]
如果您仍想创建一种副本,恐怕您必须创建自己的 set 方法来复制所需的内容和/或属性。
另一种选择是创建一个包含 QWebPage 指针作为成员的类。您可以使用内部 QWebPage 编写自己的方法,从而创建自定义方法如何使用现有的 QWebPage 实例。但这仅在您不需要在另一个上下文中使用现有实例时才有效。
【讨论】:
Jack 询问的是复制,而不是 Qt 内存模型或继承。 没错,我说不应该复制 QObjects。这是我的解释。以上是关于如何复制 QWebPage?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 QWebPage 使用的 QNetworkReply 读取数据?
如何使 QWebView/QWebPage 默认为衬线字体?