访问从另一个 QObject class 继承 class 的 QObject

Access QObject inherited class from another QObject class

我有以下 class,在应用程序开始时设置在 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'

我想我明白这个错误的原因,但我不确定我应该做什么来防止它。我需要从 MyClass 访问 MyClassModel 以便用数据填充它,但我不能 return 它进入我的 QML 文件。

您正在 return 从 getModel 发送 MyClassModel。这意味着复制对象。复制 MyClassModel 涉及调用隐式生成的复制构造函数,后者又调用基础 class (QObject) 的复制构造函数。但是 QObject 的复制构造函数是 private,这就是你得到错误的原因。 Qt 的设计者很久以前就决定 QObject 应该是不可复制的。

解决方法是return一个指针:

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