如何复制 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 读取数据?

如何在非 GUI 应用程序中使用 QWebPage

如何使 QWebView/QWebPage 默认为衬线字体?

赋值前引用的局部变量?

如何将参数 -fvisibility=default 添加到 CMAKE? [复制]

首次加载后 QWebPage 无法正常工作