我有一个公开继承自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;
};
当我构建项目时,编译器抱怨:
WARNING ::应该显式初始化基类“class QWidget” 在复制构造函数中。
我从stackoverflow上的其他问题中检查过,得到了我的答案。 但事实是,当我添加这样的初始化时:
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;
};
我收到了编译错误:
QWidget :: QWidget(const QWidget&)在此上下文中是私有的
所以,请解释一下我做错了什么。
答案 0 :(得分:17)
QObject Class说明页面告诉:
QObject既没有复制构造函数也没有赋值运算符。这是设计的。实际上,它们是声明的,但是在具有宏Q_DISABLE_COPY()的私有部分中。实际上,从QObject(直接或间接)派生的所有Qt类都使用此宏来声明其复制构造函数和赋值运算符是私有的。推理可以在Qt对象模型页面上关于Identity vs Value的讨论中找到。
这意味着您不应该复制QT对象,因为QObject在设计上是不可复制的。
第一个警告告诉您初始化基类(即QWidget)。如果你想这样做,你将构建一个新的基础对象,我怀疑这是你想要做的。
第二个错误告诉你我上面写的内容:不要复制qt对象。
答案 1 :(得分:11)
通过从QObject派生,所有Qt类都是不可复制的。
在C ++中通常的做法是禁止某些价值语义操作,例如复制多态对象。 Qt给出了一些例子,说明如果documentation中的QObject允许复制会出现问题:
Qt对象......
- 可能有一个唯一的QObject :: objectName()。如果我们复制一个Qt对象,我们应该给出什么名称?
- 在对象层次结构中具有位置。如果我们复制Qt对象,副本应该放在哪里?
- 可以连接到其他Qt对象以向它们发射信号或接收它们发出的信号。如果我们复制一个Qt对象,我们应该怎么做 将这些连接转移到副本?
- 可以在运行时为其添加未在C ++类中声明的新属性。如果我们复制一个Qt对象,应该复制 包括添加到原始属性的属性?