2014-11-06 17 views
5

Sono nuovo nella codifica in QML e sto provando a scrivere la mia prima app del sistema operativo Sailfish. Per il backend ho creato una classe C++. Tuttavia, voglio istanziare un oggetto di quella classe C++ e usarlo sia nella copertina che nella pagina principale (due file QML separati), così posso lavorare con gli stessi dati, memorizzati in quella classe. Come indirizzare lo stesso oggetto nei file QML separati?Condividere un oggetto tra file QML

risposta

7

È possibile rendere l'oggetto disponibili nel contesto QtQuick:

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

in main.cpp

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

e da qualsiasi luogo in QML:

console.log(sharedObject.mySharedSlot()) 

se si don' Se vuoi che sia "globale" in QML, puoi incassarlo un po ', basta creare un altro derivato QObject ed classe, registrarlo per istanziare in QML e avere una proprietà in esso che restituisce un puntatore a quell'istanza dell'oggetto, in questo modo sarà disponibile solo dove istanziate l'oggetto 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 
}; 

in main.cpp

MySharedObject obj; 
qRegisterMetaType<MySharedObject*>(); 

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

e in QML

import Test 1.0 
... 
SharedObjAccessor { 
     id: acc 
} 
... 
console.log(acc.sharedObject.mySharedSlot()) 
Problemi correlati