2016-02-17 4 views
1

J'ai la classe suivante, dans un ContextProperty au début de l'application:Accès QObject hérité classe d'une autre classe QObject

class MyClass : public QObject 
{ 
    Q_OBJECT 

public: 
    Q_INVOKABLE MyClassModel getModel() const { return m_myClassModel; } 
private: 
    MyClassModel  m_myClassModel; 
} 

Dans l'une de ses méthodes, MyClass remplit m_myClassModel avec des données (provenant d'un serveur).

MyClassModel hérite aussi QObject (à cause de Q_PROPERTY macros):

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(); 
... 
} 

Puis, dans un fichier QML, MyClassModel est utilisé pour déclencher des signaux et mettre à jour les éléments graphiques:

Item 
{ 
    anchors.fill: parent 

    CustomLabel 
    { 
     Connections 
     { 
      target: myClass.myClassModel() 
      onStuffChanged: { console.log("signal triggered!") } 
     } 
    } 
} 

En raison de Q_INVOKABLE MyClassModel getModel() const { return m_myClassModel; } , J'obtiens cette erreur:

error: C2248: 'QObject::QObject' : cannot access private member declared in class 'QObject' 

Je pense que je comprends la cause de cette erreur, mais je ne suis pas sûr de ce que je devrais faire pour l'empêcher. J'ai besoin d'avoir accès à MyClassModel de MyClass afin de le remplir avec des données, mais je ne peux pas le retourner dans mon fichier QML.

Répondre

3

Vous renvoyez MyClassModel à partir de getModel. Cela signifie copier l'objet. La copie MyClassModel implique un appel au constructeur de copie généré implicitement, qui à son tour appelle le constructeur de copie de la classe de base (QObject). Mais le constructeur de copie de QObject est private, c'est pourquoi vous obtenez une erreur. Les concepteurs de Qt ont décidé il y a longtemps que le QObject devrait être non-copiable.

La solution est de retourner un pointeur:

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

explication Excellent, merci! –