Come sticky header per un GridLayout in un Flickable

0

Domanda

Ho un GridLayout popolato da un Ripetitore (una TableView non si adatta alle mie esigenze), all'interno di un Flickable così posso scorrere il contenuto.

Voglio che il mio GridLayout per avere un'intestazione, che posso facilmente aggiungendo Texts prima che il mio Ripetitore di simile a questo:

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)
                    }
                }
            }
        }
    }
}

Tuttavia, vorrei che il mio intestazione ad essere "appiccicosa" / "congelati", cioè rimangono visibili durante lo scorrimento della Flickable. Ho potuto creare il mio intestazione al di fuori del Flickable, tuttavia il GridLayout non mi dà il finale di riga dimensioni, quindi non posso fare la mia posizione di intestazione testi.

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

Migliore risposta

0

E 'un po' sporca, ma ho trovato una soluzione.

Prima di tutto, creare "dummy" intestazioni Items. È possibile rendere il loro Layout.minimalWidth la larghezza dell'intestazione di testo, se necessario.

Quindi, in un Articolo prima che la Flickable, creare l'intestazione, assicurarsi che non è allineata in senso orizzontale con griglia e posizionare gli elementi utilizzando il x i valori di intestazione.

Infine, impostare un margine negativo sul Flickable per rimuovere l'estranei riga aggiunta da manichino intestazioni.

Ho provato anche utilizzando fillWidth: true su manichini e quindi impostando il width di ogni elementi di intestazione, ma il lato negativo è che si modifica la tabella larghezza della colonna.

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

In altre lingue

Questa pagina è in altre lingue

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