2010-04-16 8 views
9

Ich benutze Qt und habe einige echte Grundprobleme. Ich habe mein eigenes Widget MyTest erstellt, das eine Variable obj hat. Ich muss diese Variable obj von einem Objekt außerhalb des Widgets festlegen, so dass die Variable nicht nur ein Zeiger auf ein anderes Objekt kopiert wird. Ich erhalte eine Fehlermeldung und kann nicht herausfinden, wie man dieses grundlegende Zeug macht. Dies ist der Code Ich verwende:Wie kopiere ich Objekte 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); 
} 

Antwort

24

Es scheint die Kopie Konstruktor und Zuweisungsoperator sind deaktiviert. Von this.

Kein Copykonstruktor oder Zuweisungsoperator

QObject hat weder einen Kopierkonstruktor noch einen Zuweisungsoperator. Das ist Absicht. Eigentlich sind sie deklariert, aber in einem privaten Bereich mit dem Makro Q_DISABLE_COPY(). Tatsächlich verwenden alle von QObject abgeleiteten Qt-Klassen (direkt oder indirekt) dieses Makro, um ihren Kopierkonstruktor und ihren Zuweisungsoperator als privat zu deklarieren. Die Begründung findet sich in der Diskussion auf Identity vs Value auf der Qt Object Model Seite.

Die wichtigste Konsequenz ist, dass Sie Zeiger auf QObject (oder auf Ihre QObject-Unterklasse) verwenden sollten, wo Sie sonst versucht sein könnten, Ihre QObject-Unterklasse als Wert zu verwenden. Ohne einen Kopierkonstruktor können Sie beispielsweise keine Unterklasse von QObject als Wert verwenden, der in einer der Containerklassen gespeichert werden soll. Sie müssen Zeiger speichern.

+1

Ich möchte klarstellen, dass nichts daran hindert, Q_DISABLE_COPY-Makro zu verwenden, auch wenn Ihre Klasse nicht von QObject ableitet, da es überhaupt nichts mit QObject zu tun hat. – rightaway717

3

Aaron ist korrekt über die Verwendung des Zuweisungsoperators.

Die einzige Möglichkeit, die ich kenne, um eine Kopie eines Objekts zu erstellen, ist die Verwendung der Serialisierung, wie in der QDataStream-Klasse beschrieben. Dies würde eine tiefe Kopie des Objekts machen.

Oder haben Sie erwogen, die Klasse als QSharedPointer-Zeiger zu verpacken, den Sie sicher weitergeben können. Dies wäre jedoch eine Schatten- oder Referenzkopie des Objekts.

Verwandte Themen