如何在C++端获取QQuickItem的有效实例
How to get a valid instance of a QQuickItem on C++ side
好的。我找了很多,但还没有找到一个好的解决方案。我是Qt
的新手。我有一个类是QQuickItem
,像这样,
class MyQuickItemClass : public QQuickItem
{
Q_OBJECT
SetInfo(SomeCppClass object)
};
我在我的main.cpp
中做一个qmlRegisterType
,在qml
侧注册它,就像这样,
qmlRegisterType<MyQuickItemClass>("MyQuickItemClass",1,0,"MyQuickItemsClass"(;
在这里之前一切都很好。但是->我想设置一个对象实例&MyQuickItemClass中的一些属性以及其中的一些C++逻辑&然后将CCD_ 6对象传递给CCD_。或者,从Qml中获取MyQuickItemClass
的有效实例如何从main.cpp
中C++侧的QML
获取vlid实例MyQuickItemClass
对象实例
我试着从这里的链接中学习以下内容。但这种技术创建了MyQuickItemClass
的两个独立对象。一个来自QML
;一个来自CCD_ 14侧。因此对我不起作用。
以下是我在经过大量搜索后如何尝试做到这一点。
int main(int argc, char *argv[])
{
qmlRegisterType< MyQuickItemClass >("MyQuickItemClass", 1, 0, "MyQuickItemClass");
QQmlApplicationEngine engine;
SomeCppClass someCppClassObject;
someCppClassObject.updateSomething();
MyQuickItemClass myquickItemObject;
myquickItemObject.SetInfo(someCppClassObject);
engine.rootContext()->setContextProperty("myquickItemObject", &myquickItemObject);
engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
return app.exec();
}
但是,执行以上操作会调用MyQuickItemClass
的构造函数两次。一次是在创建对象时从cpp
侧,一次是从qml
侧。通过在MyQuickItemClass
的构造函数中放置断点也验证了这一点。结果,当程序运行时,我设置的someCppClassObject
在MyQuickItemClass
内部为空。因为qml已经对MyQuickItemClass
进行了最后一次调用来实例化,因此忽略了我在main.cpp
中创建的MyQuickItemClass
对象
这是我为MyQuickItemClass
:编写的qml
代码
import QtQuick 2.5
import MyQuickItemClass 1.0
ParentContainerItem {
id: parentItem
color: "black"
MyQuickItemClass {
id: myQuickItemID
visible: true
objectName: "myQuickItem"
property bool someProperty1: false
property bool someProperty2: true
anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter
}
//Other qml components
}
这就是C++类,它的对象需要设置到MyQuickItemClass
中。
SomeCppClass {
//Pure C++ class. No Qt
}
请注意,我需要保留源自QQuickItem
的MyQuickItemClass
。请建议。。。
通常,避免访问QML实例化对象from outside
是个好主意,因为大多数访问方法都生成了从C++到QML的依赖关系,从而限制了QML树的执行方式。
例如,要求某些对象存在于某个时间点,具有特定的objectName
值等。
最好从QML端通过调用公开的C++对象/API上的方法来"注册"对象,或者让QML从其自己的C++代码中实例化对象本身。
后者显然本质上是自动的,即这样一个类的每个实例都会这样做,而前者则由QML代码决定它想让哪个创建的实例知道。
根据讨论中的建议执行以下操作可以解决问题&将有效对象获取到QuickItem qml文件
QQuickItem *myItem = engine.rootObjects()[0]->findChild<QQuickItem *>("myQuickItem");
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- GCC对可能有效的代码抛出init list生存期警告
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 使用无符号字符数组有效存储内存
- 自定义先决条件对移动分配运算符有效吗
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 为什么这种直接初始化有效?(C++17)
- 递归函数有效,但无法记忆
- 在C++中初始化向量映射的最有效方法
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 钳制迭代器是否有效
- 如何有效地在 std::vector 中插入一对?
- 构造函数中的 QQuickItem 父项 null
- C++模板 t 不是有效的模板类型
- 如何在C++端获取QQuickItem的有效实例