Как создать липкий заголовок для сетки в изменяемом

0

Вопрос

У меня есть сетка, заполненная ретранслятором (просмотр таблицы не соответствует моим потребностям), внутри которой можно переключаться, чтобы я мог прокручивать содержимое.

Я хочу, чтобы у моей сетки был заголовок, который я могу легко добавить Texts перед моим ретранслятором вот так:

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

Однако я хотел бы, чтобы мой заголовок был "липким" / "замороженным", т. Е. оставался видимым при прокрутке экрана. Я мог бы создать свой заголовок за пределами перелистываемого, однако сетка не дает мне окончательных размеров строк, поэтому я не могу расположить тексты заголовков.

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

Лучший ответ

0

Это немного банально, но я нашел решение.

Во-первых, создайте "фиктивные" заголовки, которые являются Items. Вы можете сделать набор своих Layout.minimalWidth чтобы быть шириной текста заголовка, если вам это нужно.

Затем в элементе перед щелчком создайте свой заголовок, убедитесь, что он выровнен по горизонтали с сеткой, и расположите элементы с помощью x значения заголовка.

Наконец, установите отрицательное поле на переключаемом, чтобы удалить лишнюю строку, добавленную фиктивными заголовками.

Я также пробовал использовать fillWidth: true на манекенах, а затем установив width каждого элемента заголовка, но недостатком является то, что он изменяет ширину столбца таблицы.

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

На других языках

Эта страница на других языках

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