【问题标题】:Share an object between QML files在 QML 文件之间共享对象
【发布时间】:2014-11-06 15:22:19
【问题描述】:

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

【问题讨论】:

    标签: c++ qt qml


    【解决方案1】:

    您可以使对象在 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())
    

    【讨论】:

      猜你喜欢
      • 2020-04-02
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 2017-05-29
      • 2012-08-18
      • 1970-01-01
      相关资源
      最近更新 更多