2014-11-06 15 views
5

Jestem nowy w kodowaniu w QML i próbuję napisać moją pierwszą aplikację Sailfish OS. Dla zaplecza utworzyłem jedną klasę C++. Jednak chcę utworzyć instancję jednego obiektu z tej klasy C++ i użyć go zarówno na okładce, jak i na stronie głównej (dwa oddzielne pliki QML), dzięki czemu mogę pracować z tymi samymi danymi przechowywanymi w tej klasie. Jak adresuje ten sam obiekt w oddzielnych plikach QML?Udostępnianie obiektu między plikami QML

Odpowiedz

7

Można dokonać przedmiot dostępny w kontekście QtQuick:

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

w main.cpp

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

iz dowolnego miejsca w QML:

console.log(sharedObject.mySharedSlot()) 

jeśli nie” Jeśli chcesz mieć to "globalnie" w QML, możesz zrobić trochę, by je enkapsulować, po prostu stwórz inną pochodną QObject ed klasy, zarejestruj ją, aby utworzyć instancję w QML i mieć właściwość, która zwraca wskaźnik do tej instancji obiektu, w ten sposób będzie dostępna tylko wtedy, gdy utworzysz obiekt QML "accessor".

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 
}; 

w main.cpp

MySharedObject obj; 
qRegisterMetaType<MySharedObject*>(); 

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

aw QML

import Test 1.0 
... 
SharedObjAccessor { 
     id: acc 
} 
... 
console.log(acc.sharedObject.mySharedSlot()) 
Powiązane problemy