10

I have a class which is publicly inherited from QWidget:

class MyWidget : public QWidget
{
    Q_OBJECT
public:
    MyWidget(const MyWidget& other)
      :
    obj1(other.obj1),
    obj2(other.obj2)

private:
    some_class obj1;
    some_class obj2;
};

When I built my project, compiler complains:

WARNING:: Base class "class QWidget" should be explicitly initialized in the copy constructor.

I checked out from other questions on stackoverflow, and got my answer. But the fact is, when I added that initialization like this:

class MyWidget : public QWidget
{
    Q_OBJECT
public:
    MyWidget(const MyWidget& other)
      :
    QWidget(other),   //I added the missing initialization of Base class
    obj1(other.obj1),
    obj2(other.obj2)

private:
    some_class obj1;
    some_class obj2;
};

I got compile error:

QWidget::QWidget(const QWidget&) is private within this context

So, please explain me what I am doing wrong.

4

2 回答 2

20

QObject 类描述页面告诉:

QObject 既没有复制构造函数也没有赋值运算符。这是设计使然。实际上,它们是被声明的,但是在一个带有宏 Q_DISABLE_COPY() 的私有部分中。事实上,所有从 QObject(直接或间接)派生​​的 Qt 类都使用这个宏来声明它们的复制构造函数和赋值运算符是私有的。推理可以在 Qt 对象模型页面上关于 Identity vs Value 的讨论中找到。

这意味着您不应该复制 QT 对象,因为 QObject 在设计上是不可复制的。

第一个警告告诉您初始化基类(即 QWidget)。如果你想这样做,你将构建一个新的基础对象,我怀疑这就是你想要做的。

第二个错误是告诉你我上面写的:不要复制 qt 对象。

于 2013-09-30T11:08:41.330 回答
14

所有 Qt 类都不能通过派生自 QObject 来复制。

C++ 中的常见做法是禁止某些值语义操作,例如在多态对象上进行复制。Qt 给出了一些示例,说明如果在其文档中允许 QObject 复制会出现的问题:

一个 Qt 对象...

  • 可能有一个唯一的 QObject::objectName()。如果我们复制一个 Qt 对象,我们应该给这个副本起什么名字呢?
  • 在对象层次结构中有一个位置。如果我们复制一个 Qt 对象,副本应该放在哪里?
  • 可以连接到其他 Qt 对象以向它们发出信号或接收它们发出的信号。如果我们复制一个 Qt 对象,我们应该如何将这些连接转移到副本中呢?
  • 可以在运行时添加未在 C++ 类中声明的新属性。如果我们复制一个 Qt 对象,副本是否应该包括添加到原始对象的属性?
于 2013-09-30T11:11:09.670 回答