在QML文件之间共享对象

Iva*_*oev 6 c++ qt qml

我是QML编码的新手,我正在尝试编写我的第一个Sailfish OS应用程序.对于后端,我创建了一个C++类.但是,我想实例化该C++类的一个对象,并在Cover和主页面(两个单独的QML文件)中使用它,因此我可以使用存储在该类中的相同数据.如何在单独的QML文件中寻址同一个对象?

dte*_*ech 8

您可以在QtQuick上下文中使对象可用:

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

在main.cpp中

MySharedObject obj;    
view.rootContext()->setContextProperty("sharedObject", &obj);
Run Code Online (Sandbox Code Playgroud)

从QML的任何地方:

console.log(sharedObject.mySharedSlot())
Run Code Online (Sandbox Code Playgroud)

如果你不想让它在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
};
Run Code Online (Sandbox Code Playgroud)

在main.cpp中

MySharedObject obj;
qRegisterMetaType<MySharedObject*>();

SharedObjAccessor::setSharedObject(&obj);
qmlRegisterType<SharedObjAccessor>("Test", 1, 0, "SharedObjAccessor");
Run Code Online (Sandbox Code Playgroud)

并在QML中

import Test 1.0
...
SharedObjAccessor {
        id: acc
}
...
console.log(acc.sharedObject.mySharedSlot())
Run Code Online (Sandbox Code Playgroud)