【问题标题】:Access QObject inherited class from another QObject class访问从另一个 QObject 类继承的 QObject 类
【发布时间】:2016-02-17 16:34:28
【问题描述】:

我有以下课程,在应用程序开头设置为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 才能用数据填充它,但我无法将其返回到我的QML 文件中。

【问题讨论】:

    标签: qt qml qobject


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-24
      • 1970-01-01
      • 2011-03-31
      • 2012-01-24
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多