Как я копирую объект в QT?

Я использую 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);
}
10
задан Alison R. 2 February 2015 в 19:37
поделиться

2 ответа

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

Я знаю, что единственный способ сделать копию объекта, если это действительно необходимо, - это использовать сериализацию, как описано в разделе «Класс QDataStream». Это сделает глубокую копию объекта.

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

4
ответ дан 3 December 2019 в 15:21
поделиться

Похоже, конструктор копирования и оператор присваивания отключены. Из это .

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

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

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

25
ответ дан 3 December 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: