2011-07-24 41 views
13

我需要能够复制一个Qwidget,所以我可以复制一个窗口,因为它会在运行时更改。这可能吗?复制一个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(); 
} 

回答

11

这是设计。解决此问题的常用方法是实现一种方法(通常称为clone()),该方法允许您指定在复制类的实例时应应用的确切语义。这种方法还可以防止意外复制,比如容器类。

Qt docs

没有拷贝构造函数或赋值操作符

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

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