Я пытаюсь создать многоразовый компонент 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 мог получить доступ ко всем из них (поскольку вызывающий также определяет модель).
Дополнительный вопрос: есть ли лучший способ сделать это?