我有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问题并没有给我一个准确的答案。因此,更清楚地重述我的问题以尝试得到答案。感谢对此的建议..
答案 0 :(得分:2)
如果你有一个库对象的单个实例,根据你需要的访问类型,有两种方法可以解决它:
将实例作为MyQuickItem
类的静态成员,在创建QML应用程序之前在main.cpp
初始化它,然后您可以从MyQuickItem
内部访问它C ++。
让实例继承QObject
并将其作为上下文属性公开,这样就可以从QML访问它。
如果它不是单个对象,则有两个操作过程:
QQmlApplicationEngine::rootObjects().at(0).findChild()
作为类型和对象名称在对象树中查找QML对象,如果找到则将有一个指向该对象的指针但是,作为您喜欢的问题的答案之一,这并不是真正的推荐做法。可能有更好的方法,你不应该在main.cpp中设置QML对象属性,它应该在MyQuickItem
的构造函数或公共接口中。
答案 1 :(得分:2)
:
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 */ }
}