如何在Qt中复制对象?

Mar*_*tin 10 qt copy qobject

我正在使用Qt并且有一些真正的基本问题.我创建了自己的具有变量的小部件MyTest obj.我需要obj从窗口小部件外部的对象设置此变量,以便复制变量而不仅仅是指向另一个对象的指针.我收到一条错误消息,无法弄清楚如何做这个基本的东西.这是我正在使用的代码:

MyTest.h:

class MyTest : public QWidget
{
    Q_OBJECT

    public:
        void setObj(QObject &inobj);

        QObject obj;
    ....
}
Run Code Online (Sandbox Code Playgroud)

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 &)'"
}
Run Code Online (Sandbox Code Playgroud)

main.cpp中:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QObject *ob = new QObject();

    MyTest w;
    w.setObj(*ob);
}
Run Code Online (Sandbox Code Playgroud)

NG.*_*NG. 25

似乎禁用了复制构造函数和赋值运算符.从这个.

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

QObject既没有复制构造函数也没有赋值运算符.这是设计的.实际上,它们是声明的,但是在具有宏Q_DISABLE_COPY()的私有部分中.实际上,从QObject(直接或间接)派生​​的所有Qt类都使用此宏来声明其复制构造函数和赋值运算符是私有的.其理由是在讨论中发现VS价值认同上的Qt的对象模型页.

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


pho*_*tom 5

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

我所知道的复制对象的唯一方法(如果您真的必须这样做)是使用 QDataStream 类中描述的序列化。这将制作对象的深层副本。

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