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

Posted

技术标签:

【中文标题】访问从另一个 QObject 类继承的 QObject 类【英文标题】:Access QObject inherited class from another QObject class 【发布时间】: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 文件中。

【问题讨论】:

【参考方案1】:

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

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

Q_INVOKABLE MyClassModel* getModel() const  return &m_myClassModel; 

【讨论】:

以上是关于访问从另一个 QObject 类继承的 QObject 类的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个 QT 应用程序访问 Qt UI 的 QObject?

QObject::~QObject: 定时器不能从另一个线程停止

6.5 继承

不能继承于QObject的类就一定不能使用信号槽?(用一个代理类进行发射就行了)

如何从另一个文件中的外部类访问变量

在visual studio 2010中为新的QOBJECT文件生成MOC