QObject::findChild 返回 null,找不到跨 QML 对象

Posted

技术标签:

【中文标题】QObject::findChild 返回 null,找不到跨 QML 对象【英文标题】:QObject::findChild returns null, can't find cross QML objects 【发布时间】:2013-09-06 20:31:21 【问题描述】:

我有一个关于在 C++ 端访问 QML 组件的问题,对不起,它可能是一个小初学者。

我目前正在使用sample map view,该应用程序单独运行良好,但在我尝试将此示例与导航面板放在一起后,它停止工作。

我添加了我自己的 main.qml,另一个名为 menu.qml 的页面,并将应用程序的原始 main.qml 重命名为 map.qml。所以现在用户需要像这样导航面板:main.qml -> menu.qml -> map.qml

我的问题是: 最初,从示例中,app 构造函数在创建 main.qml 时保存了一个 mapView 指针,以便稍后它可以向 mapview 添加标记/更改位置。

通过调用获取mapView指针:

QmlDocument *qml = QmlDocument::create("asset:///main.qml").parent(this);
qml->setContextProperty("_mapViewTest", this);
AbstractPane *root = qml->createRootObject<AbstractPane>();
QObject* mapViewAsQObject = root->findChild<QObject*>(QString("mapViewObj"));
mapView = qobject_cast<bb::cascades::maps::MapView*>(mapViewAsQObject);

但是,我已将名称更改为 map.qml,findChild 返回为 null。由于我的应用无法找到 mapView,因此当我尝试自己设置标记/定位时,整个应用都会崩溃。

我尝试了QmlDocument::create("asset:///map.qml"),并使用与上面相同的方法找到了mapview,我能够得到它,但是当我尝试时没有任何反应放下一个标记/定位。

我还尝试添加一个调用 findChild 并获取 mapView 指针的新函数。该函数在 map.qml 页面内的 onCreationCompleted 中被调用,但 mapViewAsQObject 仍然返回 null 并且应用程序崩溃。

任何提示将不胜感激!谢谢

【问题讨论】:

【参考方案1】:

我找到了解决问题的方法,当点击下一个按钮时,我必须使用 C++ 导航推送页面,这样它才能找到正确的 mapView 指针。

 QmlDocument *qml = QmlDocument::create("asset:///map.qml").parent(this);
 qml->setContextProperty("_mapViewTest", this);
 Page *root = qml->createRootObject<Page>();
 QObject* mapViewAsQObject = root->findChild<QObject*>(QString("mapViewObj"));
 ... etc
 nav->push(root);

【讨论】:

没花你很长时间

以上是关于QObject::findChild 返回 null,找不到跨 QML 对象的主要内容,如果未能解决你的问题,请参考以下文章

等价于 QObject::findChild 函数的 qml-child-items

qt批量操作同类型控件

Blazor 服务器应用程序;在浏览器中刷新作为类的属性返回 nul

Oracle中nul()函数

qt 怎么根据ui文件动态创建QWIdget窗口部件?

为啥 environment.getProperty("spring.profiles.active") 在使用 @ActiveProfiles 激活测试中的配置文件时返回 nul