2016-02-17 2 views
1

У меня есть следующий класс, расположенный в ContextProperty в начале применения:доступ QObject унаследовал класс от другого класса QObject

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.

ответ

3

Вы возвращаетесь MyClassModel от getModel. Это означает копирование объекта. Копирование MyClassModel включает вызов неявно сгенерированного конструктора копий, который, в свою очередь, вызывает конструктор копирования базового класса (QObject). Но конструктор копирования QObject - private, поэтому вы получаете сообщение об ошибке. Дизайнеры Qt давно решили, что QObject должны быть не скопированы.

Решение является возвращать указатель:

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

Отлично объяснение, спасибо! –

Смежные вопросы