我需要能够复制一个 Qwidget,这样我才能复制一个窗口,因为它会在运行时发生变化。这可能吗?
void Duplicate(QWidget * Show)
{
//I tried...
Qwidget Shw = *Show; //but operator= is private
//and the copy constructor (I think), which is also private
Qwidget Shw(*Show);
//
Shw.Show();
}
我需要能够复制一个 Qwidget,这样我才能复制一个窗口,因为它会在运行时发生变化。这可能吗?
void Duplicate(QWidget * Show)
{
//I tried...
Qwidget Shw = *Show; //but operator= is private
//and the copy constructor (I think), which is also private
Qwidget Shw(*Show);
//
Shw.Show();
}
这是设计使然。解决它的常用方法是实现一个方法(通常称为clone()
),该方法允许您指定在复制类实例时应应用的确切语义。这种方法还可以防止无意的复制被隐式地复制,例如通过容器类。
来自Qt 文档:
没有复制构造函数或赋值运算符
QObject 既没有复制构造函数也没有赋值运算符。这是设计使然。实际上,它们是被声明的,但是在一个带有宏 Q_DISABLE_COPY() 的私有部分中。事实上,所有从 QObject(直接或间接)派生的 Qt 类都使用这个宏来声明它们的复制构造函数和赋值运算符是私有的。推理可以在Qt 对象模型页面上关于Identity vs Value的讨论中找到。
主要结果是您应该使用指向 QObject(或指向您的 QObject 子类)的指针,否则您可能会试图将 QObject 子类用作值。例如,如果没有复制构造函数,就不能使用 QObject 的子类作为要存储在容器类之一中的值。您必须存储指针。