Хорошо, я думаю, что не существует готового решения, соответствующего вашим потребностям. GridView
не имеет раздела, а LisView
не имеет столбцов. Я могу предложить свое собственное псевдо-решение, своего рода обходной путь. Мы можем создать сетку и в этой сетке мы можем создавать разделы. Поскольку GridView
не имеет свойства columnSpan
, я думаю, что вместо него можно использовать GridLayout
.
Итак, это элемент "view":
GridSection.qml
import QtQuick 2.12
import QtQuick.Layouts 1.12
Flickable {
id: root
property int columns: 1
property ListModel model: ListModel {}
property Component itemDelegate: Item {}
property Component sectionDelegate: Item {}
contentHeight: layout.height
contentWidth: layout.width
GridLayout {
id: layout
columns: 3
columnSpacing: 0
rowSpacing: 0
Component.onCompleted: {
var lastSection = "";
for(var i = 0;i < root.model.count;i ++)
{
var element = root.model.get(i);
if(element.section !== lastSection)
root.sectionDelegate.createObject(layout, { "name": element.section, "Layout.columnSpan": root.columns });
root.itemDelegate.createObject(layout, { "name": element.name });
lastSection = element.section;
}
}
}
}
и использование:
main.qml
import QtQuick 2.12
import QtQuick.Window 2.12
Window {
id: main
visible: true
width: 400
height: 400
GridSection {
anchors.fill: parent
columns: 3
model: ListModel {
ListElement { name: "element1"; section: "section1" }
ListElement { name: "element2"; section: "section1" }
ListElement { name: "element3"; section: "section1" }
ListElement { name: "element4"; section: "section2" }
ListElement { name: "element5"; section: "section2" }
ListElement { name: "element6"; section: "section3" }
ListElement { name: "element7"; section: "section3" }
ListElement { name: "element8"; section: "section3" }
ListElement { name: "element9"; section: "section3" }
}
itemDelegate: Rectangle {
property string name
color: "greenyellow"
width: 100
height: 50
Text {
text: name
anchors.centerIn: parent
}
}
sectionDelegate: Rectangle {
property string name
width: 300
height: 20
color: "orange"
Text {
text: name
anchors.centerIn: parent
}
}
}
}
Поскольку мы не можем создать динамические c свойства в QML мы должны сначала создать stati c свойства (property string name
) в делегатах. Но вы можете сделать то же самое в C ++, используя setProperty без определения значений c.