我刚接触QML编码,而且我正试图编写我的第一个Sailfish OS应用程序。对于后端,我创建了一个C ++类。但是,我想实例化该C ++类的一个对象,并在Cover和主页面(两个单独的QML文件)中使用它,因此我可以使用存储在该类中的相同数据。如何在单独的QML文件中处理同一个对象?
答案 0 :(得分:8)
您可以在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
派生类,注册它以在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())