2014-11-06 194 views
5

我是QML編程新手,我正在嘗試編寫我的第一個Sailfish操作系統應用程序。對於後端,我創建了一個C++類。但是,我想實例化該C++類的一個對象,並在封面和主頁(兩個獨立的QML文件)中使用它,因此我可以使用存儲在該類中的相同數據。如何在單獨的QML文件中尋址同一個對象?在QML文件之間共享對象

回答

7

您就可以將物體在QtQuick方面:

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

在main.cpp中

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

,並從任何地方在QML:

console.log(sharedObject.mySharedSlot()) 

如果你不」要想在QML中擁有「全局」,你可以稍微封裝它,只需創建另一個QObject deriv ed類,註冊它在QML中實例化,並在其中有一個屬性,它返回一個指向該對象實例的指針,這樣它將僅在實例化「訪問者」QML對象的位置可用。

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

在main.cpp中

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())