【问题标题】:How do I copy object in Qt?如何在 Qt 中复制对象?
【发布时间】:2010-04-16 11:29:51
【问题描述】:

我正在使用 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);
}

【问题讨论】:

    标签: qt copy qobject


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我想澄清一点,即使你的类不是从 QObject 派生的,也没有什么能阻止你使用 Q_DISABLE_COPY 宏,因为它与 QObject 完全无关。
    【解决方案2】:

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

    我知道复制对象的唯一方法是使用 QDataStream 类中描述的序列化。这将制作对象的深层副本。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-03-10
        • 2011-01-02
        • 2010-10-26
        • 1970-01-01
        • 2011-07-25
        • 1970-01-01
        相关资源
        最近更新 更多