2010-04-16 2 views
9

Я использую Qt и имею некоторые реальные основные проблемы. Я создал свой собственный виджет MyTest, который имеет переменную obj. Мне нужно установить эту переменную 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(). Фактически, все Qt-классы, полученные из QObject (прямые или косвенные), используют этот макрос, чтобы объявить свой конструктор и оператор присваивания частным. Обоснование можно найти в разделе Identity vs Value на странице Qt Object Model.

Главное следствие состоит в том, что вы должны использовать указатели на QObject (или ваш подкласс QObject), где в противном случае вы могли бы искусить использование вашего подкласса QObject в качестве значения. Например, без конструктора копирования вы не можете использовать подкласс QObject в качестве значения, которое должно быть сохранено в одном из классов контейнера. Вы должны хранить указатели.

+1

Я хотел бы пояснить, что ничто не мешает вам использовать макрос Q_DISABLE_COPY, даже если ваш класс не является результатом QObject, поскольку он вообще не имеет никакого отношения к QObject. – rightaway717

3

Аарон прав относительно использования оператора присваивания.

Единственный способ, которым я знаю, сделать копию объекта, если вам действительно нужно, - использовать Сериализацию, как описано в классе QDataStream. Это сделает глубокую копию объекта.

Или вы считали, что это класс класса как указатель QSharedPointer, который можно безопасно обойти. Тем не менее, это будет теневая или эталонная копия объекта.