好的。我已经搜索了很多,但还没有找到一个好的解决方案。我是Qt
的新手。我有一个类似QQuickItem
的类,
class MyQuickItemClass : public QQuickItem
{
Q_OBJECT
SetInfo(SomeCppClass object)
};
我在我的qmlRegisterType
中main.cpp
在qml
这样注册,
qmlRegisterType< MyQuickItemClass>(" MyQuickItemClass",1,0," MyQuickItemClass");
直到这里都好。但是 - >我想设置一个对象实例& MyQuickItemClass中的一些属性,其中的一些C ++逻辑也是如此。然后将MyQuickItemClass
对象传递给qml
。或者,从Qml获取有效的MyQuickItemClass
实例。 如何在MyQuickItemClass
的C ++端从QML
获取vlid实例main.cpp
对象实例?
我尝试从链接here进行以下学习。但是这种技术创建了MyQuickItemClass
的两个独立对象。一个来自QML
,&一个来自c++
方。因此对我不起作用。
以下是我在经过大量搜索后尝试这样做的方法。
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
进行最终调用以实例化,因此忽略了我在MyQuickItemClass
中创建的main.cpp
对象。
以下是qml
的{{1}}代码:
MyQuickItemClass
这是C ++类,其对象需要设置为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
}
。
MyQuickItemClass
请注意,我需要保留SomeCppClass {
//Pure C++ class. No Qt
}
来自MyQuickItemClass
。请建议......
答案 0 :(得分:1)
通常,最好避免访问QML实例化对象from outside
,因为大多数访问方法都会生成从C ++到QML的依赖关系,从而限制了QML树的完成方式。
E.g。要求某些对象在某个时间点存在,具有特定的objectName
值等等。
最好通过调用暴露的C ++对象/ API上的方法从QML端“注册”对象,或者使QML实例化对象在其自己的C ++代码中注册自己。
后者本质上是自动的,即这样一个类的每个实例都会这样做,而前者则由QML代码自行决定它想要知道的创建实例。
答案 1 :(得分:0)
根据讨论中的建议here执行以下操作可解决问题&amp;获取QuickItem qml文件的有效对象
QQuickItem *myItem = engine.rootObjects()[0]->findChild<QQuickItem *>("myQuickItem");