如何在C ++端获得QQuickItem的有效实例

时间:2016-10-21 13:46:34

标签: c++ qt qml qqmlcomponent qquickitem

好的。我已经搜索了很多,但还没有找到一个好的解决方案。我是Qt的新手。我有一个类似QQuickItem的类,

class MyQuickItemClass : public QQuickItem
{
    Q_OBJECT
    SetInfo(SomeCppClass object)
};

我在我的qmlRegisterTypemain.cppqml这样注册,

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。请建议......

2 个答案:

答案 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");