2014-11-06 5 views
5

QML로 코딩하는 데 익숙하며 처음으로 Sailfish OS 앱을 작성하려고합니다. 백엔드에서는 하나의 C++ 클래스를 만들었습니다. 그러나 C++ 클래스의 객체 하나를 인스턴스화하고 Cover와 기본 페이지 (두 개의 개별 QML 파일)에서 모두 사용하므로 같은 클래스에 저장되어있는 동일한 데이터로 작업 할 수 있습니다. 별도의 QML 파일에서 동일한 객체를 어떻게 처리합니까?QML 파일간에 개체 공유

당신은 QtQuick 컨텍스트에서 개체를 사용할 수 있습니다

답변

7

:

MAIN.CPP

MySharedObject obj;  
view.rootContext()->setContextProperty("sharedObject", &obj); 

어디서나 QML에서의

class MySharedObject : public QObject { 
    Q_OBJECT 
public: 
    MySharedObject(QObject * p = 0) : QObject(p) {} 
public slots: 
    QString mySharedSlot() { return "blablabla"; } 
}; 

:

console.log(sharedObject.mySharedSlot()) 

것은 당신이 '돈 경우 QML에서 "전역"으로 만들고 싶다면 캡슐화하기 위해 조금만 돌아 가면 다른 QObject 파생물을 만들 수 있습니다. QML에서 인스턴스화하고 그 안에 객체 인스턴스에 대한 포인터를 반환하는 속성을 등록하십시오. 이렇게하면 "접근 자"QML 객체를 인스턴스화하는 경우에만 사용할 수 있습니다.

MySharedObject obj; 
qRegisterMetaType<MySharedObject*>(); 

SharedObjAccessor::setSharedObject(&obj); 
qmlRegisterType<SharedObjAccessor>("Test", 1, 0, "SharedObjAccessor"); 

및 QML

import Test 1.0 
... 
SharedObjAccessor { 
     id: acc 
} 
... 
console.log(acc.sharedObject.mySharedSlot()) 
MAIN.CPP에

class SharedObjAccessor : public QObject { 
    Q_OBJECT 
    Q_PROPERTY(MySharedObject * sharedObject READ sharedObject) 

public: 
    SharedObjAccessor(QObject * p = 0) : QObject(p) {} 
    MySharedObject * sharedObject() { return _obj; } 
    static void setSharedObject(MySharedObject * obj) { _obj = obj; } 
private: 
    static MySharedObject * _obj; // remember to init in the cpp file 
};