2011-07-24 17 views
13

Necesito poder copiar un Qwidget para poder duplicar una ventana porque cambiará durante el tiempo de ejecución. ¿es posible?Duplicar un 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(); 
} 

Respuesta

11

Esto es por diseño. La forma habitual de resolverlo es implementar un método (generalmente llamado clone()) que le permite especificar la semántica exacta que debe aplicarse al copiar instancias de su clase. Este enfoque también evita que las copias no intencionales se hagan implícitamente, por ejemplo, mediante clases de contenedor.

Desde el Qt docs:

Sin constructor de copia o cesión operador

QObject tiene ni un constructor de copia ni un operador de asignación. Esto es por diseño. En realidad, están declarados, pero en una sección privada con la macro Q_DISABLE_COPY(). De hecho, todas las clases de Qt derivadas de QObject (directo o indirecto) utilizan esta macro para declarar que su constructor de copias y su operador de asignación son privados. El razonamiento se encuentra en la discusión en Identity vs Value en la página Modelo de Objeto Qt .

La principal consecuencia es que se debe utilizar punteros a QObject (o al la subclase QObject) en la que de otro modo podría estar tentado a usar su subclase QObject como un valor. Por ejemplo, sin una copia del constructor , no puede usar una subclase de QObject como el valor almacenado en una de las clases de contenedor. Debe almacenar punteros.