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

How to get a valid instance of a QQuickItem on C++ side

本文关键字:QQuickItem 有效 实例 获取 C++      更新时间:2023-10-16

好的。我找了很多,但还没有找到一个好的解决方案。我是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的构造函数中放置断点也验证了这一点。结果,当程序运行时,我设置的someCppClassObjectMyQuickItemClass内部为空。因为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
}

请注意,我需要保留源自QQuickItemMyQuickItemClass。请建议。。。

通常,避免访问QML实例化对象from outside是个好主意,因为大多数访问方法都生成了从C++到QML的依赖关系,从而限制了QML树的执行方式。

例如,要求某些对象存在于某个时间点,具有特定的objectName值等。

最好从QML端通过调用公开的C++对象/API上的方法来"注册"对象,或者让QML从其自己的C++代码中实例化对象本身。

后者显然本质上是自动的,即这样一个类的每个实例都会这样做,而前者则由QML代码决定它想让哪个创建的实例知道。

根据讨论中的建议执行以下操作可以解决问题&将有效对象获取到QuickItem qml文件

QQuickItem *myItem = engine.rootObjects()[0]->findChild<QQuickItem *>("myQuickItem");