如何在 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 访问它。
如果不是单例对象,你有两种做法:
- 从 C++ 创建 QML 对象,它会给你直接指向它的指针
- 通过使用
QQmlApplicationEngine::rootObjects().at(0).findChild()
类型和对象名称在对象树中找到 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 */ }
}
我有 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 访问它。
如果不是单例对象,你有两种做法:
- 从 C++ 创建 QML 对象,它会给你直接指向它的指针
- 通过使用
QQmlApplicationEngine::rootObjects().at(0).findChild()
类型和对象名称在对象树中找到 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 */ }
}