Qt自带的QML使用Model/View框架的example中,展示数据使用的delegate(似乎)都是唯一的,不能根据不同的Model数据项使用不同的Item来展示。如果有这样一个需求:Model的数据项中有一个字段为itemType,展示数据时希望能够根据这个字段使用不同的Item来展示数据,能否实现呢?自然是可以的:我们可以将View的delegate字段设为一个Loader,然后让这个Loader根据itemType设置source,即可实现这个需求。
为了简单起见,展示数据的多个Item只是颜色不同,itemType可选的值有"red"/“green”/“blue”,那么代码如下:
// main.qml
import QtQuick 2.9
import QtQuick.Window 2.2
import QtQml.Models 2.1
Window {
visible: true
width: 600
height: 480
title: qsTr("Hello World")
ListModel {
id: pageModel
ListElement {
itemType: "red"
display: "red page"
}
ListElement {
itemType: "green"
display: "green page"
}
ListElement {
itemType: "blue"
display: "blue page"
}
}
ListView {
anchors.fill: parent
orientation: ListView.Horizontal
snapMode: ListView.SnapOneItem
model: pageModel
delegate: Loader {
source: {
switch (itemType) {
case "red": return "RedPage.qml";
case "green": return "GreenPage.qml";
case "blue": return "BluePage.qml";
}
}
}
}
}
// RedPage.qml
import QtQuick 2.0
Rectangle {
width: 200
height: 480
color: "red"
Text {
id: centerText
anchors.centerIn: parent
color: "white"
text: display
}
}
// GreenPage.qml
import QtQuick 2.0
Rectangle {
width: 200
height: 480
color: "green"
Text {
id: centerText
anchors.centerIn: parent
color: "white"
text: display
}
}
// BluePage.qml
import QtQuick 2.0
Rectangle {
width: 200
height: 480
color: "blue"
Text {
id: centerText
anchors.centerIn: parent
color: "white"
text: display
}
}