如何在"QQuickItem"派生类中访问"QQmlApplicationEngine&q

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

本文关键字:quot 访问 QQmlApplicationEngine QQuickItem 派生      更新时间:2023-10-16

以下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派生类的函数中的QQmlApplicationEngine对象?如果是,如何?

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

请注意,TestItemqml端注册并显示在主窗口中。我知道我可以通过main方法的QQmlApplicationEngine。但是,我有一种预感,因为我的TestItem是窗口的一部分并保存上下文。应该有一种方法可以获取对象或指向QQmlApplicationEngine的指针,而不必从方法传递main

目标:使用QQmlApplicationEngine,我可以通过这样做来访问main.qml中的QQuickItem

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

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

您可以使用此静态函数:

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

当然,在尝试为其调用engine()之前,contextForObject()是否返回有效的指针可能是个好主意。

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