QML: Как я могу передать свойства модели делегату, загруженному внутри делегата GridView (или ListView)?

Я пытаюсь создать многоразовый компонент QML, внутри которого размещается GridView. Каждый элемент в GridView имеет набор поведений (в основном, отображение и работу с мышью), который является общим для всего приложения. Однако то, что отображается внутри элементов GridView, меняется в зависимости от варианта использования. (То есть один и тот же инкапсулированный компонент для одного GridView, но в другом месте приложения он может использовать другой компонент.)

Итак, я бы хотел, чтобы каждый вызов предоставлял делегата, который добавляется к каждому элементу в GridView, который уже является делегатом. Другими словами, примерно так:

MyGrid.qml

import QtQuick 1.1

Rectangle {
  id: myGrid
  objectName: "myGrid"

  property Component internalDelegate
  property variant internalModel

  GridView {
    anchors.fill: parent

    delegate: Row {
      Loader {
        sourceComponent: myGrid.internalDelegate
      }
    }

    model: parent.internalModel
  }
}

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

Main.qml

import QtQuick 1.1

Rectangle {
  anchors.fill: parent

  width: 300
  height: 200

  MyGrid {
    anchors.fill: parent

    internalDelegate: Text {
      text: name
    }

    internalModel: ListModel {
      ListElement {
        name: "a"
      }

      ListElement {
        name: "b"
      }
    }
  }
}

Однако это не работает. QML сообщает, что «имя» - это неизвестная переменная внутри текстового элемента. Если я заменю переменную имени строкой (например, «привет»), она будет работать должным образом.

У меня вопрос: как передать переменную name в internalDelegate или, что еще лучше, сделать доступной всю Модель, чтобы internalDelegate мог получить доступ ко всем из них (поскольку вызывающий также определяет модель).

Дополнительный вопрос: есть ли лучший способ сделать это?

16
задан eyllanesc 20 April 2018 в 18:55
поделиться