2

好吧。我已经搜索了很多,但还没有一个好的解决方案。我是新手Qt。我有一堂课是QQuickItem这样的,

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

qmlRegisterType在我的旁边做一个这样的main.cpp注册,qml

qmlRegisterType< MyQuickItemClass >("MyQ​​uickItemClass", 1, 0, "MyQuickItemClass");

到这里为止一切都很好。但是->我想在 MyQuickItemClass 中设置一个对象实例和一些属性,其中还有一些 C++ 逻辑,然后将MyQuickItemClass对象传递给qml. 或者,MyQuickItemClass从 Qml 获取一个有效的实例。如何从C++ 端获取 vlid 实例MyQuickItemClass对象实例?QMLmain.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进行了最后调用,因此忽略了我在.MyQuickItemClassMyQuickItemClassmain.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
}

请注意,我需要保持MyQuickItemClassQQuickItem. 请建议...

4

2 回答 2

1

一般来说,避免访问 QML 实例化对象是一个好主意,from outside因为大多数访问方法会生成从 C++ 到 QML 的依赖关系,从而限制了 QML 树的完成方式。

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

最好通过在暴露的 C++ 对象/API 上调用方法从 QML 端“注册”对象,或者让 QML 实例化对象在其自己的 C++ 代码中注册自身。

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

于 2016-10-22T16:05:36.083 回答
0

根据此处讨论中的建议执行以下操作可解决问题并获得 QuickItem qml 文件的有效对象

QQuickItem *myItem = engine.rootObjects()[0]->findChild<QQuickItem *>("myQuickItem");
于 2016-10-23T17:45:36.507 回答