2010-04-16 15 views
9

Estoy usando Qt y tengo algunos problemas básicos reales. He creado mi propio widget MyTest que tiene una variable obj. Necesito establecer esta variable obj desde un objeto fuera del widget para que la variable se copie no solo como un puntero a otro objeto. Recibo un mensaje de error y no puedo entender cómo hacer estas cosas básicas. Este es el código que estoy usando:¿Cómo copio un objeto en Qt?

MyTest.h:

class MyTest : public QWidget 
{ 
    Q_OBJECT 

    public: 
     void setObj(QObject &inobj); 

     QObject obj; 
    .... 
} 

MyTest.cpp:

void MyTest::setObj(QObject &inobj) { 
    obj = inobj; //HERE I get the error message: "illegal access from 'QObject' to protected/private member 'QObject::operator=(const QObject &)'" 
} 

main.cpp:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QObject *ob = new QObject(); 

    MyTest w; 
    w.setObj(*ob); 
} 

Respuesta

24

Parece que la copia constructor y operador de asignación están deshabilitados. Desde this.

Sin constructor de copia o de operador de asignación

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 Qt derivadas de QObject (directo o indirecto) usan esta macro para declarar que su constructor de copia y el operador de asignación son privados. El razonamiento se encuentra en la discusión en Identity vs Value en la página Qt Object Model.

La consecuencia principal es que debe usar punteros a QObject (o a su subclase QObject) donde de lo contrario podría estar tentado de usar su subclase QObject como un valor. Por ejemplo, sin un constructor de copia, no puede usar una subclase de QObject como el valor que se almacenará en una de las clases de contenedor. Debe almacenar punteros.

+1

Me gustaría aclarar que nada le impide usar la macro Q_DISABLE_COPY incluso si su clase no se deriva de QObject, ya que no tiene nada que ver con QObject. – rightaway717

3

Aaron tiene razón sobre el uso del operador de asignación.

La única manera que conozco para hacer una copia de un objeto, si realmente tiene que hacerlo, es utilizar la serialización como se describe en QDataStream Class. Esto haría una copia profunda del objeto.

O ha considerado envolver la clase como un puntero QSharedPointer que puede pasar con seguridad. Sin embargo, esta sería una sombra o copia de referencia del objeto.

Cuestiones relacionadas