15

我需要能够复制一个 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();
}
4

1 回答 1

15

这是设计使然。解决它的常用方法是实现一个方法(通常称为clone()),该方法允许您指定在复制类实例时应应用的确切语义。这种方法还可以防止无意的复制被隐式地复制,例如通过容器类。

来自Qt 文档

没有复制构造函数或赋值运算符

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

主要结果是您应该使用指向 QObject(或指向您的 QObject 子类)的指针,否则您可能会试图将 QObject 子类用作值。例如,如果没有复制构造函数,就不能使用 QObject 的子类作为要存储在容器类之一中的值。您必须存储指针。

于 2011-07-24T20:53:26.510 回答