Как мне скопировать объект в Qt? - PullRequest
10 голосов
/ 16 апреля 2010

Я использую Qt, и у меня есть некоторые серьезные проблемы. Я создал свой собственный виджет MyTest, который имеет переменную obj. Мне нужно установить эту переменную obj из объекта вне виджета, чтобы переменная копировалась не просто указатель на другой объект. Я получаю сообщение об ошибке и не могу понять, как это сделать. Это код, который я использую:

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);
}

Ответы [ 2 ]

25 голосов
/ 16 апреля 2010

Кажется, что конструктор копирования и оператор присваивания отключены. С это .

Нет конструктора копирования или оператора присваивания

QObject не имеет ни конструктора копирования, ни оператора присваивания. Это по замыслу. На самом деле они объявлены, но в закрытом разделе с макросом Q_DISABLE_COPY (). Фактически, все классы Qt, производные от QObject (прямые или косвенные), используют этот макрос, чтобы объявить их конструктор копирования и оператор присваивания закрытыми. Обоснование можно найти в обсуждении Identity vs Value на странице Qt Object Model .

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

4 голосов
/ 16 апреля 2010

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

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

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

...