我正在使用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);
}
答案 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)
如果您要传输数据并希望使用最简单的方法,只需在两个小部件之间创建一个信号和插槽即可。将它们连接到主窗口小部件中,并在调用插槽时传递数据。