如何在 C++ 中获取中继器的委托数据?

Posted

技术标签:

【中文标题】如何在 C++ 中获取中继器的委托数据?【英文标题】:how to get Repeater's delegate data in c++? 【发布时间】:2018-10-25 13:31:23 【问题描述】:

在 QML 中如下所示:

Repeater 
    objectName: "main_layer_wnd"
    id: layer_show_list
    anchors.fill: parent
    model: delegateLayerModel
    delegate: delegateLayerShow


Component 
    id: delegateLayerShow
    LayerItemWndView 
        objectName: "delegateLayerShowItem"
    

在 C++ 代码中如下所示:

mpMainLayerWnd = mpWnd->findChild<QQuickItem*>("main_layer_wnd");
QQuickItem* content = mpMainLayerWnd->property("contentItem").value<QQuickItem*>();
QList<QQuickItem*> list = content->childItems();

运行此代码时: 内容->childItems(); 这里会抛出异常,有人可以帮帮我吗?

【问题讨论】:

【参考方案1】:

首先关于您的标题:我不知道您认为委托数据是什么,但也许我们仍然会找到令人满意的答案。

对于您的错误,我想说,这是意料之中的。让我们将您的代码分解成更小的部分:

mpMainLayerWnd = mpWnd->findChild<QQuickItem*>("main_layer_wnd"); // 1
QVariant prop = mpMainLayerWnd->property("contentItem")           // 2
QQuickItem* content = prop.value<QQuickItem*>();                  // 3
QList<QQuickItem*> list = content->childItems();                  // 4
    你找到了孩子。这应该没问题,您将在 mpMainLayerWnd 中有一个 QQuickItem* 您尝试读取不存在的属性contentItem。你得到一个空的QVariant。 您尝试将空的QVariant 的内容转换为QQuickItem*,这将导致nullptr 您尝试访问nullptr 的方法。

=> nullptr 上没有方法 childItems()


我不清楚的是,为什么您希望在 Repeater 中有 contentItem,因为在 QObjectQQuickItemRepeater 中都没有记录。

您很可能会将default propertycontentItem 混淆。默认属性是 QML 自动将您在对象的 中创建的所有内容分配给该属性,而不会将其分配给其他属性。

Item 
    id: rootItem
    Item  // this will go to the rootItems default property (data)
    


接下来是我一开始想知道的:您尝试访问的委托数据是什么?你想得到组件吗?然后就可以读取Repeater的属性delegate了。

您想获取delegate 的实例吗?在这里我有点迷路了。我认为它们在Repeaterchildren()Repeaters 父级的childItem() 中。

【讨论】:

谢谢。我想获取委托的实例,它们在中继器父级的 childItem() 中。

以上是关于如何在 C++ 中获取中继器的委托数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C++ 访问 QML ListView 委托项目?

如何在 JavaScript 中继承 C++ 类?

如何在非托管 C++ 中捕获托管异常(来自委托)?

如何在C++中继承后覆盖基类的成员

如何使用中继器中的单选按钮从 sql 中检索数据?

如何在托管 c++ 2010 中向事件添加委托?