如何在QQuickItem中设置纯C ++对象实例

时间:2016-10-22 17:40:20

标签: c++ qt qml qquickitem

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

class MyQuickItem : public QQuickItem {
  MyQuickItem();
}

遵循qml的{​​{1}}代码:

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中将MyCppLibApiClass的对象设置为成员。我可以使用setter方法完成此操作。但是,首先我需要获得MyQuickItem的有效实例。那么如何访问MyQuickItem中的MyQuickItem

在问这个问题之前,我已经搜索了很多。我读完了这个link。此外,我发布的This问题并没有给我一个准确的答案。因此,更清楚地重述我的问题以尝试得到答案。感谢对此的建议..

2 个答案:

答案 0 :(得分:2)

如果你有一个库对象的单个实例,根据你需要的访问类型,有两种方法可以解决它:

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

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

如果它不是单个对象,则有两个操作过程:

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

答案 1 :(得分:2)

你在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,只需设置属性&#34; myItem&#34;在QML上下文的根级别上,作为对自定义对象的引用。

修改

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

根据评论中的要求:

使用qmlRegisterType&lt;&gt;()用于在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 */ }

 }