Как получить данные делегата Repeater в C ++? - PullRequest
0 голосов
/ 25 октября 2018

В 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();

при запуске этого кода: content-> childItems ();Здесь выкинет исключение, может кто-нибудь мне помочь?

1 Ответ

0 голосов
/ 25 октября 2018

Итак, сначала кое-что о вашем названии: я понятия не имею, что вы считаете данными делегата , но, возможно, мы все равно найдем удовлетворительный ответ.

Для вашей ошибки, я бы сказал,это ожидаемо.Давайте разберем ваш код на более мелкие части:

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
  1. Вы найдете ребенка.Это должно быть хорошо, и у вас будет QQuickItem* в mpMainLayerWnd
  2. Вы пытаетесь прочитать свойство contentItem, которое не существует.Вы получаете пустой QVariant.
  3. Вы пытаетесь преобразовать содержимое пустого QVariant в QQuickItem*, что приведет к nullptr
  4. Вы пытаетесь получить доступ кметод nullptr.

=> Нет метода childItems() на nullptr


Что неясно моему, почему вы ожидаете иметьcontentItem в Repeater, поскольку не таковое задокументировано в QObject, QQuickItem или в Repeater.

Скорее всего, вы смешаете default property с contentItem.Свойство по умолчанию - это свойство, которому QML автоматически назначает все, что вы создаете в { } объекта, без присвоения его какому-либо другому свойству.

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

Следующим шагом является то, чем я былв начале интересно: к каким данным делегата вы пытаетесь получить доступ?Хотите получить Компонент?Затем вы можете прочитать свойство delegate из Repeater.

Вы хотите получить экземпляры delegate?Здесь я немного растерялся.Я думаю, что они входят в children() Repeater и childItem() в Repeater s родителя.

...