如何在Qt中复制对象?

时间:2010-04-16 11:29:52

标签: qt copy qobject

我正在使用Qt并且有一些真正的基本问题。我创建了自己的具有变量obj的小部件MyTest。我需要从窗口小部件外部的对象设置此变量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);
}

3 个答案:

答案 0 :(得分:25)

似乎禁用了复制构造函数和赋值运算符。来自this

没有复制构造函数或赋值运算符

QObject既没有复制构造函数也没有赋值运算符。这是设计的。实际上,它们是声明的,但是在具有宏Q_DISABLE_COPY()的私有部分中。实际上,从QObject(直接或间接)派生​​的所有Qt类都使用此宏来声明其复制构造函数和赋值运算符是私有的。可以在Identity vs Value页面上的Qt Object Model讨论中找到推理。

主要结果是你应该使用指向QObject(或你的QObject子类)的指针,否则你可能会试图将QObject子类用作值。例如,如果没有复制构造函数,则不能使用QObject的子类作为要存储在其中一个容器类中的值。你必须存储指针。

答案 1 :(得分:4)

关于使用赋值运算符,Aaron是正确的。

如果你真的需要,我知道制作对象副本的唯一方法是使用QDataStream类中描述的序列化。这将成为对象的深层副本。

或者您是否考虑将类包装为可以安全传递的QSharedPointer指针。这将是对象的阴影或引用副本。

答案 2 :(得分:0)

如果您要传输数据并希望使用最简单的方法,只需在两个小部件之间创建一个信号和插槽即可。将它们连接到主窗口小部件中,并在调用插槽时传递数据。