从另一个QObject类

时间:2016-02-17 16:34:29

标签: qt qml qobject

我有以下类,在应用程序开头的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文件中。

1 个答案:

答案 0 :(得分:3)

您将从MyClassModel返回getModel。这意味着复制对象。复制MyClassModel涉及对隐式生成的复制构造函数的调用,该复制构造函数又调用基类(QObject)的复制构造函数。但QObject的复制构造函数为private,这就是您收到错误的原因。很久以前,Qt的设计师已经决定QObject应该是不可复制的。

解决方案是返回一个指针:

Q_INVOKABLE MyClassModel* getModel() const { return &m_myClassModel; }