如何访问派生 class 的 `QQuickItem` 中的 `QQmlApplicationEngine` 对象?

How can I get access to object of `QQmlApplicationEngine` inside a `QQuickItem` derived class?

QtApp 的以下典型 main 函数中的变量 engineQQmlApplicationEngine.

的有效实例
int main(int argc, char *argv[])
{
  QGuiApplication app(argc, argv);

  QQmlApplicationEngine engine;
  engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));

  return app.exec();
}

是否可以在 QQuickItem 派生的 class 函数中访问 QQmlApplicationEngine 的对象?如果是,如何?

class TestItem : public QQuickItem {
public:
  TestItem();
  SomeMethod() {
     // Is it possible to get access to QQmlApplicationEngine here somehow ?
  }
}

请注意 TestItem 注册在 qml 侧并显示在主 window 上。我知道我可以通过 QQmlApplicationEngine from main 方法。但是,我有一种预感,因为我的 TestItem 是 window 的一部分并且拥有上下文。应该有一种方法可以获取指向 QQmlApplicationEngine 的对象或指针,而不必从 main 方法传递?

objective: 使用 QQmlApplicationEngine 我可以访问 main.qml 中的 QQuickItem,方法是:

QQuickItem *some_quick_item = qml_engine->rootObjects()[0]->findChild<QQuickItem*>("SomeQuickItem");

所以为了做到这一点,我想要 QQmlApplicationEngine。如果有办法从内部访问其他 QQuickItem,请提出建议。

你可以使用这个静态函数:

QQmlEngine::contextForObject(this)->engine();

当然,在尝试为它调用 engine() 之前,先确定 contextForObject() returns 是否为有效指针可能是个好主意。

然后您可以使用 qobject_cast<QQmlApplicationEngine*>(engine),只要您的应用程序确实是基于 QQmlApplicationEngine 的应用程序,它应该会为您提供所需的指针。