好吧。我已经搜索了很多,但还没有一个好的解决方案。我是新手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
. 或者,MyQuickItemClass
从 Qml 获取一个有效的实例。如何从C++ 端获取 vlid 实例MyQuickItemClass
对象实例?QML
main.cpp
我尝试从此处的链接中进行以下学习。但是这种技术会创建两个独立的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
设置的内部为空。因为 qml 已经对实例化MyQuickItemClass
进行了最后调用,因此忽略了我在.MyQuickItemClass
MyQuickItemClass
main.cpp
这是我的qml
代码MyQuickItemClass
:
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
}
请注意,我需要保持MyQuickItemClass
从QQuickItem
. 请建议...