我需要能够复制一个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子类用作要存储在其中之一的容器类中的值。您必须存储指针。