Я хочу создать анимированный элемент, похожий на аккордеон, который расширяется при нажатии. Вот как это должно работать.
Когда пользователь щелкает один из красных прямоугольников, зеленый прямоугольник, который является фактическим содержимым, должен расширяться. Я хочу, чтобы это дополнение было анимировано. Высота содержимого зеленых прямоугольников может быть разной для каждого красного заголовка.
Мне удалось реализовать поведение «нажми, чтобы развернуть», но анимации нет. Вот код, который у меня сейчас есть.
AccordionElement.qml
import QtQuick 2.5
import QtQuick.Layouts 1.1
ColumnLayout {
id: rootElement
property string title: ""
property bool isOpen: false
default property alias accordionContent: contentPlaceholder.data
anchors.left: parent.left; anchors.right: parent.right
// Header element
Rectangle {
id: accordionHeader
color: "red"
anchors.left: parent.left; anchors.right: parent.right
height: 50
MouseArea {
anchors.fill: parent
Text {
text: rootElement.title
anchors.centerIn: parent
}
cursorShape: Qt.PointingHandCursor
onClicked: {
rootElement.isOpen = !rootElement.isOpen
}
}
}
// This will get filled with the content
ColumnLayout {
id: contentPlaceholder
visible: rootElement.isOpen
anchors.left: parent.left; anchors.right: parent.right
}
}
И вот как он используется из родительского элемента:
Accordion.qml
ColumnLayout {
Layout.margins: 5
visible: true
AccordionElement {
title: "Title1"
accordionContent: Rectangle {
anchors.left: parent.left; anchors.right: parent.right
height: 20
color: "green"
}
}
AccordionElement {
title: "Title2"
accordionContent: Rectangle {
anchors.left: parent.left; anchors.right: parent.right
height: 50
color: "green"
}
}
AccordionElement {
title: "Title3"
accordionContent: Rectangle {
anchors.left: parent.left; anchors.right: parent.right
height: 30
color: "green"
}
}
// Vertical spacer to keep the rectangles in upper part of column
Item {
Layout.fillHeight: true
}
}
Это дает следующий результат (когда все прямоугольники развернуты):
В идеале я хотел бы, чтобы зеленые прямоугольники выкатились из красных прямоугольников (как бумага из принтера). Но я застрял в том, как это сделать. Я попробовал несколько подходов с использованием свойства height
, и зеленый прямоугольник исчез, но белое пространство осталось под красным прямоугольником.
Любая помощь будет оценена по достоинству. Есть ли подход, который мне не хватает?