如何在 C++ 端获取 QQuickItem 的 C++ 对象实例

How to get a C++ object instance of a QQuickItem on C++ side

我有 QtApp 和一个纯 C++ 库。 C++ 库公开了一个名为 MyCppLibApiClass 的简单 class。 QtApp 有一个嵌入在 main.qml 上的 class。以下是 class:

class MyQuickItem : public QQuickItem {
  MyQuickItem();
}

遵循 qml 代码 quick item:

import MyQuickItem 1.0

MyQuickItem {
  id: myQuickItemID
  visible: true
  objectName: "myQuickItem"
}

以下是我的 main.cpp 显示我加载了 qml 项目:

qmlRegisterType<MyQuickItem>("MyQuickItem", 1, 0, "MyQuickItem");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
return app.exec();

MyQuickItem 需要访问 MyCppLibApiClass 实例。 如何在 main.cpp 中获取 MyQuickItem 的有效实例? 我需要将 MyCppLibApiClass 的对象设置为 [=21= 中的成员].我可以使用 setter 方法来做到这一点。但是,首先我需要获得 MyQuickItem 的有效实例。那么 如何在 main.cpp 中访问 MyQuickItem

编辑:
在问这个问题之前,我已经搜索了很多。我通读了我发布的这个 link. Also, 问题,没有得到准确的答案。因此,更清楚地改写我的问题以尝试获得答案。感谢对此的建议..

如果您只有一个库对象实例,根据您需要的访问权限类型,您可以通过两种方式进行操作:

  • 将实例作为 MyQuickItem class 的静态成员,在创建 QML 应用程序之前在 main.cpp 中对其进行初始化,然后就可以访问它来自 C++ 中的 MyQuickItem.

  • 让实例继承 QObject 并将其公开为上下文 属性,这样就可以从 QML 访问它。

如果不是单例对象,你有两种做法:

但是,正如您喜欢的问题的答案之一所暗示的那样,这并不是真正的推荐做法。可能有更好的方法来做到这一点,你不应该在 main.cpp 中设置 QML 对象属性,它应该在 MyQuickItem 的构造函数或 public 接口中。

在你的 main.cpp:

qmlRegisterType<MyQuickItem>("MyQuickItem", 1, 0, "MyQuickItem");
QQmlApplicationEngine engine;
MyQuickItem myItem;
engine.rootContext()->setContextProperty("myItem", &myItem);
engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));

现在您可以从 C++ 访问 myItem 并从 QML 访问同一个 myItem,只需将 QML 上下文根级别的 属性 "myItem" 设置为对自定义对象的引用.

编辑

我在答案中添加了 qmlRegisterType 声明。

根据评论中的要求:

使用 qmlRegisterType<>() 用于在 QML 中注册特定类型,然后可以从 QML created/accessed。

通过使用 engine.rootContext()->setContextProperty("myItem", &myItem) 您实际在 C++ 中创建 myItem 并将 myItem 的所有权设置为 C++

的方法

由于 QML 旨在与 C++ 一起使用,因此可以简单地将 myItem 分配为 QML 中的 属性,并且由于 QML 自动从父对象继承 properties/objects,然后 myItem 在整个 QML 上下文中可用。

这两个例子都没有经过测试,只是为了演示这个想法

例子main.qml

import MyQuickItem 1.0

Item {
   Component.onCompleted {
        myItem.visible = true;
        myItem.myCustomMethod();
   }
}

示例 C++ Class

class MyQuickItem : public QQuickItem {


     MyQuickItem();

 public slots: 
    void myCustomMethod() { /* do some C++ stuff here */ }

 }