2014-11-06 21 views
5

QML'de kod yazmakta yeniyim ve ilk Sailfish OS uygulamasını yazmaya çalışıyorum. Arka uç için bir C++ sınıfı oluşturdum. Bununla birlikte, bu C++ sınıfının bir nesnesini tanımlamak ve hem Kapak'ta hem de ana Sayfada (iki ayrı QML dosyası) kullanmak istiyorum, böylece o sınıfta saklanan aynı verilerle çalışabilirim. Ayrı QML dosyalarındaki aynı nesneyi nasıl adresler?QML dosyaları arasındaki bir nesneyi paylaşma

Sen QtQuick bağlamında nesne kullanılabilir hale getirebilirsiniz

cevap

7

:

main.cpp

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

ve her yerden QML in

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

:

console.log(sharedObject.mySharedSlot()) 

Eğer 'etmezsen QML'de "global" olmak istiyorsan, onu kapsüllemek için birazcık gidebilirsin, sadece başka bir QObject türevini yarat ed sınıfı, QML'de örnek oluşturmak ve bu nesne örneğine bir işaretçi döndüren bir özelliğe sahip olmak için kaydedin, bu şekilde yalnızca "erişimci" QML nesnesini başlattığınız yerde kullanılabilir olacaktır.

MySharedObject obj; 
qRegisterMetaType<MySharedObject*>(); 

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

ve QML

içinde
import Test 1.0 
... 
SharedObjAccessor { 
     id: acc 
} 
... 
console.log(acc.sharedObject.mySharedSlot()) 
main.cpp içinde

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