I try to add cells to my GridLayout
by using a Repeater
. My data is stored in a model and containing two properties per element:
The model-view principle assumes that each model node displays by different delegate component object. So I advice you to listen to @BaCaRoZzo's comment and do that with Column
instead of GridLayout
. Sure, QML is very flexible and you can do something like that:
Component {
id: labelDelegate
Label { text: myList.get(_index / 2).title }
}
Component {
id: textAreaDelegate
TextArea { text: myList.get(_index / 2).value }
}
ListModel {
id: myList
ListElement {title: "title1"; value: "value1"}
ListElement {title: "title2"; value: "value2"}
ListElement {title: "title3"; value: "value3"}
}
GridLayout {
anchors.fill: parent
columns: 2
Repeater {
model: myList.count * 2
delegate: Loader {
property int _index: index
sourceComponent: {
if(index % 2)
return textAreaDelegate;
else
return labelDelegate;
}
}
}
}
but that's too weird to use it in real project.
You can simply use two Repeater
s within a GridLayout
, as follows:
import QtQuick 2.5
import QtQuick.Window 2.2
import QtQuick.Layouts 1.1
import QtQuick.Controls 1.4
Window {
width: 600; height: 400; visible: true
GridLayout {
id: grid
anchors.fill: parent
columns: 2
rowSpacing: 5
columnSpacing: 5
anchors.margins: 5
// example models
property var titles: [ "title1", "title2", "title3", "title4", "title5" ]
property var values: [ "value1", "value2", "value3", "value4", "value5" ]
Repeater {
model: grid.titles
Label {
Layout.row: index
Layout.column: 0
Layout.fillWidth: true
Layout.fillHeight: true
text: modelData
}
}
Repeater {
model: grid.values
TextArea {
Layout.row: index
Layout.column: 1
Layout.fillWidth: true
Layout.fillHeight: true
text: modelData
}
}
}
}
The index
parameter is freely available and store the current row of the model.
By using the Layout.fillWidth
attached property you can control the width
of the single column.
Of course, each cell that belongs to a column has the same size of all the other cells of that column, unlike what happens using two Column
components.
This solution has a few drawbacks, but it's good if your purpose is mainly to print plain data from a model.
You can use GridLayout.flow to specify in which order the cells should be filled, i.e. row- (GridLayout.LeftToRight
) or column-wise (GridLayout.TopToBottom
). Note that you should specify the number of rows when using GridLayout.TopToBottom
.
Using this solution, the (simplified) example of skypjack would become:
import QtQuick 2.5
import QtQuick.Window 2.2
import QtQuick.Layouts 1.1
import QtQuick.Controls 1.4
Window {
width: 600; height: 400; visible: true
GridLayout {
anchors.fill: parent
% specify the flow and number of rows
flow: GridLayout.TopToBottom
rows: repeater.count
Repeater {
id: repeater
model: [ "title1", "title2", "title3", "title4", "title5", "title6" ] // example model
Label {
Layout.fillWidth: true
Layout.fillHeight: true
text: modelData
}
}
Repeater {
model: [ "value1", "value2", "value3", "value4", "value5", "value6" ] // example model
TextArea {
Layout.fillWidth: true
Layout.fillHeight: true
text: modelData
}
}
}
}