2010-04-16 5 views
9

Qt를 사용하고 있으며 기본적인 문제가 있습니다. 변수 obj을 가진 내 자신의 위젯 MyTest를 만들었습니다. 이 변수를 위젯 외부의 객체에서 obj으로 설정하여 변수가 다른 객체에 대한 포인터가 아니라 복사되도록해야합니다. 오류 메시지가 나타나며이 기본적인 작업을 수행하는 방법을 알 수 없습니다.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); 
} 

답변

24

그것은 복사본을 보인다 이것은 내가 사용하고 코드입니다 생성자 및 대입 연산자가 비활성화됩니다. this에서.

없음 복사 생성자 또는 할당 연산자

QObject를가 복사 생성자도 할당 연산자도있다. 이는 의도적으로 설계된 동작입니다. 실제로는 선언되었지만 Q_DISABLE_COPY() 매크로가있는 개인 섹션에 있습니다. 사실 QObject에서 파생 된 모든 Qt 클래스 (직접 또는 간접)는이 매크로를 사용하여 복사 생성자 및 할당 연산자를 비공개로 선언합니다. 그 이유는 Qt Object Model 페이지의 Identity vs Value에 대한 토론에서 찾아 볼 수 있습니다.

주요 결과는 QObject 하위 클래스를 값으로 사용하려는 유혹을받을 수있는 QObject (또는 QObject 하위 클래스)에 대한 포인터를 사용해야한다는 것입니다. 예를 들어 복사 생성자가 없으면 컨테이너 클래스 중 하나에 저장 될 값으로 QObject의 하위 클래스를 사용할 수 없습니다. 포인터를 저장해야합니다.

+1

클래스가 QObject에서 파생되지 않아도 Q_DISABLE_COPY 매크로를 사용할 수 없다는 점을 분명히하고 싶습니다. QObject와는 아무런 관련이 없기 때문입니다. – rightaway717

3

아론은 대입 연산자를 사용하는 것이 정확합니다.

실제로 개체의 복사본을 만들 수 있다는 것을 알고있는 유일한 방법은 QDataStream 클래스에서 설명한대로 직렬화를 사용하는 것입니다. 이렇게하면 개체의 전체 복사본을 만들 수 있습니다.

또는 클래스를 안전하게 전달할 수있는 QSharedPointer 포인터로 래핑하는 것이 좋습니다. 이것은 그림자 또는 개체의 참조 복사본을 비록 것입니다.

관련 문제