好的。我找了很多,但还没有找到一个好的解决方案。我是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");