2010-04-16 9 views
9

Sto usando Qt e ho alcuni problemi di base reali. Ho creato il mio widget MyTest che ha una variabile obj. Devo impostare questa variabile obj da un oggetto esterno al widget in modo che la variabile venga copiata non solo da un puntatore a un altro oggetto. Ricevo un messaggio di errore e non riesco a capire come fare questa roba di base. Questo è il codice che sto utilizzando:Come si copia l'oggetto in 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); 
} 

risposta

24

Sembra la copia costruttore e assegnatore sono disabilitati. Da this.

Nessun costruttore di copia o di operatore di assegnamento

QObject non ha né un costruttore di copia, né un operatore di assegnazione. Questo è di design. In realtà, sono dichiarati, ma in una sezione privata con la macro Q_DISABLE_COPY(). Infatti, tutte le classi Qt derivate da QObject (diretta o indiretta) usano questa macro per dichiarare che il loro costruttore di copia e l'operatore di assegnazione sono privati. Il ragionamento si trova nella discussione Identity vs Value nella pagina Qt Object Model.

La conseguenza principale è che è necessario utilizzare i puntatori a QObject (o alla sottoclasse QObject) in cui si potrebbe essere tentati di utilizzare la sottoclasse QObject come valore. Ad esempio, senza un costruttore di copie, non è possibile utilizzare una sottoclasse di QObject come valore da memorizzare in una delle classi contenitore. È necessario memorizzare i puntatori.

+1

Mi piacerebbe chiarire che nulla ti impedisce di usare la macro Q_DISABLE_COPY anche se la tua classe non deriva da QObject, in quanto non ha nulla a che fare con QObject. – rightaway717

3

Aaron è corretto sull'utilizzo dell'operatore di assegnazione.

L'unico modo in cui sono consapevole di creare una copia di un oggetto, se proprio necessario, è utilizzare la serializzazione come descritto nella classe QDataStream. Ciò farebbe una copia profonda dell'oggetto.

Oppure hai considerato di avvolgere la classe come un puntatore QSharedPointer che puoi tranquillamente passare in giro. Questa sarebbe comunque una copia shadow o di riferimento dell'oggetto.