Несколько режимов в окне Qt Quick QML?

#qt #qml #qt5 #qtquick2 #qt-quick

#qt #qml #qt5 #qtquick2 #qt-быстрый

Вопрос:

Предположим, у меня есть окно QML, которое содержит множество различных элементов управления:

 Window {
  ...

  TextEdit { ... }
  CheckBox { ... }
  Button { ... }
  etc
  

}

Теперь я хочу, чтобы мое окно меняло «режим» при определенном событии и отображало совершенно другой набор элементов управления.

Представьте, что это часть многоэкранной формы. Текущее состояние — это первая страница формы. Когда пользователь нажимает кнопку «Далее», он переходит на страницу 2 формы. Я хочу добавить новый набор элементов управления, который представляет страницу 2.

Как правильно организовать это в QtQuick / QML?

Ответ №1:

Обычный способ сделать это с помощью StackView. Организация была бы примерно такой:

 Window {
    StackView {
        id: stackView
        initialItem: page1
    }
    Item {
        id: footerItem
        // Maybe add other buttons here too
        Button {
            id: nextBtn
            text: "Next"
            onClicked: {
                stackView.push(page2);
            }
        }
    }

    Component {
        id: page1
        Page1 {
             // Define this in separate Page1.qml file
             // This is where your page 1 controls go.
        }
    }
    Component {
        id: page2
        Page2 {
             // Define this in separate Page2.qml file
             // This is where your page 2 controls go.
        }
    }

}
  

Ответ №2:

Я бы, вероятно, реализовал режим изменения вида или формы с помощью кнопок «Назад» и «Далее», используя StackLayout. StackLayout Класс предоставляет стек элементов, в котором одновременно виден только один элемент. Вы переходите к следующему или предыдущему режиму путем обновления currentIndex .

 StackLayout {
    id: layout
    anchors.fill: parent
    currentIndex: 1
    Rectangle {
        color: 'teal'
        implicitWidth: 200
        implicitHeight: 200
    }
    Rectangle {
        color: 'plum'
        implicitWidth: 300
        implicitHeight: 200
    }
}