我有以下类,在应用程序开头的ContextProperty
中设置:
class MyClass : public QObject
{
Q_OBJECT
public:
Q_INVOKABLE MyClassModel getModel() const { return m_myClassModel; }
private:
MyClassModel m_myClassModel;
}
在其中一种方法中,MyClass
使用数据(来自服务器)填充m_myClassModel
。
MyClassModel
也会继承QObject
(因为Q_PROPERTY
宏):
class MyClassModel : public QObject
{
Q_OBJECT
// Lots of Q_PROPERTY macros
Q_PROPERTY(int stuff READ stuff WRITE setStuff NOTIFY stuffChanged)
public:
...
signals:
void stuffChanged();
...
}
然后,在QML文件中,MyClassModel
用于触发信号并更新图形元素:
Item
{
anchors.fill: parent
CustomLabel
{
Connections
{
target: myClass.myClassModel()
onStuffChanged: { console.log("signal triggered!") }
}
}
}
由于Q_INVOKABLE MyClassModel getModel() const { return m_myClassModel; }
,我收到此错误:
error: C2248: 'QObject::QObject' : cannot access private member declared in class 'QObject'
我想我理解这个错误的原因,但我不确定我应该做些什么来阻止它。我需要从MyClassModel
访问MyClass
以填充数据,但我无法将其返回到我的QML
文件中。
答案 0 :(得分:3)
您将从MyClassModel
返回getModel
。这意味着复制对象。复制MyClassModel
涉及对隐式生成的复制构造函数的调用,该复制构造函数又调用基类(QObject
)的复制构造函数。但QObject
的复制构造函数为private
,这就是您收到错误的原因。很久以前,Qt的设计师已经决定QObject
应该是不可复制的。
解决方案是返回一个指针:
Q_INVOKABLE MyClassModel* getModel() const { return &m_myClassModel; }