ОК, я приготовил грубый пример, я не модулировал его намеренно, поэтому вы можете увидеть, как он работает в одном источнике. Кроме того, я не знаю, как это делает почтовое приложение Windows 10, поскольку у меня его нет, но оно все еще достаточно близко к вашему описанию.
Вы начинаете с 3 видов списка в строке размера, чтобы заполнить весь пользовательский интерфейс, но если вы уменьшите размер пользовательского интерфейса до минимума 500, виды увеличатся в размере, чтобы заполнить почти весь ui, и когда вы нажимаете на элемент вида, он переместит вас к следующему виду, и если вы нажмете на предыдущее представление, вы вернетесь к нему.
ApplicationWindow {
title: qsTr("Hello World")
width: 800
height: 300
minimumWidth: 500
visible: true
Item {
id: adapt
width: parent.width
height: parent.height
property int sizeUnit: width > 500 ? width/5 : 400
property bool isPaged: width == 500 ? true : false
onIsPagedChanged: { if (!isPaged) { x = 0; page = 0; } }
property int page: 0
Behavior on x { NumberAnimation { duration: 250; easing.type: Easing.OutBack } }
ListModel {
id: mod
ListElement { name: "one" }
ListElement { name: "two" }
ListElement { name: "three" }
ListElement { name: "four" }
ListElement { name: "five" }
}
ListView {
id: v1
width: adapt.sizeUnit
height: parent.height
model: mod
delegate: Rectangle {
height: 70
width: v1.width
color: "red"
border.color: "black"
Text { anchors.centerIn: parent; text: name }
MouseArea {
anchors.fill: parent
onClicked: {
if (adapt.isPaged) {
if (adapt.page == 0) {
adapt.x = -(v2.x - 100)
adapt.page = 1
} else {
adapt.x = 0
adapt.page = 0
}
}
}
}
}
}
ListView {
id: v2
width: adapt.sizeUnit
height: parent.height
x: adapt.sizeUnit + 10
model: mod
delegate: Rectangle {
height: 70
width: v2.width
color: "cyan"
border.color: "black"
Text { anchors.centerIn: parent; text: name }
MouseArea {
anchors.fill: parent
onClicked: {
if (adapt.isPaged) {
if (adapt.page == 1) {
adapt.x = -(v3.x - 100)
adapt.page = 2
} else {
adapt.x = -(v2.x - 100)
adapt.page = 1
}
}
}
}
}
}
ListView {
id: v3
width: adapt.isPaged ? adapt.sizeUnit : 3 * adapt.sizeUnit - 20
height: parent.height
x: v2.x + v2.width + 10
model: mod
delegate: Rectangle {
height: 70
width: v3.width
color: "yellow"
border.color: "black"
Text { anchors.centerIn: parent; text: name }
}
}
}
}
Этого должно быть достаточно, чтобы ты. Очевидно, что для производства вы можете использовать более элегантную компоновку и наглядность, например, использовать функцию для фактических «скользящих страниц» и якорей, выше это просто для примера.
Я не вижу здесь «проблемы», вы вполне можете реализовать этот поток логики в своем QML-интерфейсе. Это может быть достигнуто путем «реализации» ... нет волшебства, которое сделает всю работу за вас, если это то, что вам интересно. – dtech
Qml SplitView не дает возможности показывать только один вид при необходимости и переключаться между ними. Верно, что я могу использовать свойство «visible» и скрывать представления, которые я хочу, но тогда пользовательский интерфейс не может быть анимирован. Это мое беспокойство. – daljit97
Не чувствуйте себя обязанным придерживаться элементов пользовательского интерфейса, у вас есть создание динамических объектов, анимация, состояния и все инструменты, необходимые для достижения вашей цели. – dtech