0

我有QtApp一个纯 C++ 库。C++ 库公开了一个简单的类,称为MyCppLibApiClass. 有QtApp一个嵌入在main.qml. 以下是课程:

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实例。我如何获得一个有效的MyQuickItem实例main.cpp我需要MyCppLibApiClassMyQuickItem. 我可以使用 setter 方法来做到这一点。但是,首先我需要获得一个有效的实例MyQuickItem。那么如何访问MyQuickIteminmain.cpp呢?

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

4

2 回答 2

3

如果您有一个库对象的单个实例,您可以通过两种方式来处理它,具体取决于您需要什么样的访问权限:

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

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

如果它不是单例对象,则有两种操作:

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

于 2016-10-22T18:04:11.833 回答
3

在你的 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 创建/访问。

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

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

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

示例 main.qml

import MyQuickItem 1.0

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

示例 C++ 类

class MyQuickItem : public QQuickItem {


     MyQuickItem();

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

 }
于 2016-10-22T22:56:43.133 回答