Cómo tener una pegajosa encabezado por un GridLayout en un Flickable

0

Pregunta

Tengo un GridLayout poblada por un Repetidor (un formato tableview no se adapta a mis necesidades), dentro de una Flickable para que yo pueda desplazarse por el contenido.

Quiero que mi GridLayout tener un encabezado, el cual me puede fácilmente mediante la adición de Texts antes de mi Repetidor como este:

import QtQuick 2.0
import QtQuick.Layouts 1.12

ColumnLayout {
    width: 200
    height: 200

    Flickable {
        Layout.fillWidth: true
        Layout.preferredHeight: 200
        contentWidth: width
        contentHeight: grid.height
        clip: true

        GridLayout {
            id: grid
            columns: 3
            columnSpacing: 10

            function reparentChildren(source, target) {
                while (source.children.length) {
                    source.children[0].parent = target;
                }
            }

            // Header
            Text {
                text: "Header 0"
            }
            Text {
                text: "Header 1"
            }
            Text {
                text: "Header 2"
            }

            // Data
            Repeater {
                model: 50

                Item {
                    Component.onCompleted: grid.reparentChildren(this, grid)
                    Text {
                        text: "Column 0, %1".arg(modelData)
                    }
                    Text {
                        text: "Column 1, %1".arg(modelData)
                    }
                    Text {
                        text: "Column 2, %1".arg(modelData)
                    }
                }
            }
        }
    }
}

Sin embargo, me gustaría que mi cabecera "pegajosa" / "congelada", es decir, permanecen visibles al desplazarse el Flickable. Pude crear mi cabecera fuera de la Flickable, sin embargo, el GridLayout no me da el final de la fila de los tamaños, así que no puedo posición de mi cabecera textos.

qml qt
2021-11-23 10:31:17
1

Mejor respuesta

0

Es un poco chapucero, pero he encontrado una solución.

En primer lugar, crear "dummy" de los encabezados que son Items. Usted puede hacer su conjunto Layout.minimalWidth para ser el ancho de la cabecera de texto si es necesario.

Entonces, en un Artículo antes de que el Flickable, crear su cabecera, asegúrese de que está alineados horizontalmente con la red, y la posición de los elementos utilizando la x los valores de la cabecera.

Por último, establecer un margen negativo en la Flickable para quitar la extraña fila agregada por las maquetas de los encabezados.

También he intentado usar fillWidth: true en el maniquíes y, a continuación, ajuste el width de cada uno de los elementos de encabezado, pero el inconveniente es que se modifica la tabla de ancho de columna.

import QtQuick 2.0
import QtQuick.Layouts 1.12

ColumnLayout {
    width: 200
    height: 200

    // Header
    Item {
        Layout.minimumHeight: childrenRect.height
        Layout.fillWidth: true
        Text {
            id: header0
            x: headerDummy0.x
            anchors.top: parent.top
            text: "Header 0"
        }
        Text {
            id: header1
            x: headerDummy1.x
            anchors.top: parent.top
            text: "Header 1"
        }
        Text {
            id: header2
            x: headerDummy2.x
            anchors.top: parent.top
            text: "Header 2"
        }
    }

    Flickable {
        Layout.fillWidth: true
        Layout.preferredHeight: 200
        contentWidth: width
        contentHeight: grid.height
        clip: true
        // Eliminate the first row, which are the dummies
        topMargin: - grid.rowSpacing

        GridLayout {
            id: grid
            columns: 3
            rowSpacing: 50
            columnSpacing: 10

            function reparentChildren(source, target) {
                while (source.children.length) {
                    source.children[0].parent = target;
                }
            }

            // Header dummies
            Item {
                id: headerDummy0
                Layout.minimumWidth: header0.implicitWidth
            }
            Item {
                id: headerDummy1
                Layout.minimumWidth: header1.implicitWidth
            }
            Item {
                id: headerDummy2
                Layout.minimumWidth: header2.implicitWidth
            }

            // Data
            Repeater {
                model: 50

                Item {
                    Component.onCompleted: grid.reparentChildren(this, grid)
                    Text {
                        text: "Column 0, %1".arg(modelData)
                    }
                    Text {
                        text: "Column 1, %1".arg(modelData)
                    }
                    Text {
                        text: "Column 2, %1".arg(modelData)
                    }
                }
            }
        }
    }
}
2021-11-23 10:31:17

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................