12

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

我的测试.h:

class MyTest : public QWidget
{
    Q_OBJECT

    public:
        void setObj(QObject &inobj);

        QObject obj;
    ....
}

我的测试.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 &)'"
}

主.cpp:

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

    QObject *ob = new QObject();

    MyTest w;
    w.setObj(*ob);
}
4

3 回答 3

26

似乎复制构造函数和赋值运算符被禁用。从此。_

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

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

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

于 2010-04-16T11:43:26.773 回答
5

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

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

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

于 2010-04-16T15:36:02.980 回答
0

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

于 2019-12-20T09:05:48.580 回答