QML 界面切换的方法

简介: QML 界面切换的方法

在 QML 中,有几种常见的方法可以实现界面的切换。以下是几种常见的方式:

1. 使用 StackView

StackView 是用于管理界面堆叠的控件,它允许你以栈的方式进行界面切换。你可以将多个 Item(界面)推入或弹出堆栈,从而实现切换。

示例:

qml

i

mport QtQuick 2.15
import QtQuick.Controls 2.15

ApplicationWindow {
    visible: true
    width: 640
    height: 480

    StackView {
        id: stackView
        anchors.fill: parent

        initialItem: Page1 { }

        Component.onCompleted: {
            // 在初始界面显示后,可以通过代码推送新的界面
            stackView.push(Page2)
        }
    }

    Component {
        id: page1
        Page1 {
            // 内容
        }
    }

    Component {
        id: page2
        Page2 {
            // 内容
        }
    }
}

Page1.qml
---------
import QtQuick 2.15
import QtQuick.Controls 2.15

Rectangle {
    width: 640
    height: 480

    Button {
        text: "Go to Page 2"
        onClicked: stackView.push(page2)
    }
}

Page2.qml
---------
import QtQuick 2.15
import QtQuick.Controls 2.15

Rectangle {
    width: 640
    height: 480

    Button {
        text: "Back to Page 1"
        onClicked: stackView.pop()
    }
}

2. 使用 Loader

Loader 可以动态加载 QML 组件,可以用它来实现界面切换。当你需要加载不同的界面时,Loader 会替换其 source 属性的内容。

示例:

qml

import QtQuick 2.15
import QtQuick.Controls 2.15

ApplicationWindow {
    visible: true
    width: 640
    height: 480

    Loader {
        id: loader
        anchors.fill: parent
        source: "Page1.qml"
    }

    Button {
        text: "Switch to Page 2"
        anchors.bottom: parent.bottom
        anchors.horizontalCenter: parent.horizontalCenter
        onClicked: loader.source = "Page2.qml"
    }
}

3. 使用 Repeater 和 StackLayout

如果你有多个页面需要切换,并且它们之间有类似的布局,可以使用 Repeater 配合 StackLayout 来动态生成和管理页面。

示例:

qml

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15

ApplicationWindow {
    visible: true
    width: 640
    height: 480

    StackLayout {
        id: stack
        anchors.fill: parent

        Repeater {
            model: 2 // Number of pages
            delegate: Rectangle {
                width: stack.width
                height: stack.height
                color: index % 2 === 0 ? "lightblue" : "lightgreen"
                Button {
                    text: index % 2 === 0 ? "Page 1" : "Page 2"
                    anchors.centerIn: parent
                    onClicked: stack.currentIndex = (stack.currentIndex + 1) % 2
                }
            }
        }
    }
}

4. 使用 States 和 Transitions

States 和 Transitions 提供了一种基于状态的界面切换方法,适合用于简单的视图切换场景。

示例:

qml

import QtQuick 2.15
import QtQuick.Controls 2.15

ApplicationWindow {
    visible: true
    width: 640
    height: 480

    Rectangle {
        width: 640
        height: 480

        state: "page1"

        states: [
            State {
                name: "page1"
                when: currentState === "page1"
                PropertyChanges {
                    target: page1
                    visible: true
                }
                PropertyChanges {
                    target: page2
                    visible: false
                }
            },
            State {
                name: "page2"
                when: currentState === "page2"
                PropertyChanges {
                    target: page1
                    visible: false
                }
                PropertyChanges {
                    target: page2
                    visible: true
                }
            }
        ]

        transitions: [
            Transition {
                from: "page1"
                to: "page2"
                reversible: true
                ParallelAnimation {
                    NumberAnimation { properties: "opacity"; from: 0; to: 1; duration: 500 }
                }
            }
        ]

        Rectangle {
            id: page1
            width: 640
            height: 480
            color: "lightblue"
            visible: true
            Button {
                text: "Go to Page 2"
                onClicked: currentState = "page2"
            }
        }

        Rectangle {
            id: page2
            width: 640
            height: 480
            color: "lightgreen"
            visible: false
            Button {
                text: "Back to Page 1"
                onClicked: currentState = "page1"
            }
        }
    }
}

总结

StackView:适用于复杂的界面堆叠和导航场景。

Loader:适合动态加载和切换不同的 QML 组件。

Repeater 和 StackLayout:用于动态生成和管理多个类似界面。

States 和 Transitions:适用于状态驱动的视图切换和动画效果。

目录
相关文章
|
计算机视觉 容器
Qt实用技巧:在Qt Gui程序中嵌入qml界面(可动态覆盖整个窗口)
Qt实用技巧:在Qt Gui程序中嵌入qml界面(可动态覆盖整个窗口)
Qt实用技巧:在Qt Gui程序中嵌入qml界面(可动态覆盖整个窗口)
|
API 计算机视觉
Qt实用技巧:自定义窗口标题栏
Qt实用技巧:自定义窗口标题栏
Qt实用技巧:自定义窗口标题栏
|
7月前
|
搜索推荐
【qt】自定义界面类
【qt】自定义界面类
59 0
|
C++ Windows
Qt-QML-Popup,弹层界面编写
随着接触Qt的时间的增加,也逐渐的发现了Qt 的一些不人信话的一些地方,不由的想起一句话,也不知道是在哪里看到的了“一切变成语言都是垃圾,就C++还可以凑合用”大致意思是这样。最近项目的祝界面框架都基本写完了,那自我感觉良好,感觉自己QML的不得了了,全部用的都是自己YY出来的空间,今天小伙伴在同伴代码后,用到了我的模块,给我说了一个BUG,
534 0
Qt-QML-Popup,弹层界面编写
QT之Qml使用QSystemTrayIcon实现系统托盘
QT之Qml使用QSystemTrayIcon实现系统托盘
QT应用编程: Qt自定义界面并提升窗口部件基类
QT应用编程: Qt自定义界面并提升窗口部件基类
795 0
QT应用编程: Qt自定义界面并提升窗口部件基类
Qt-第一个QML程序-4-自定义按钮类,动画,状态
上篇中,我们写到了自己定义了一个按钮,但是呢,按照这样的写法,要写一个程序出来,那要累死了,所以,qml给我的感觉就是各种随便调用,所以了,可以自己写一个自己Button的qml,这样在以后用到了,就可以直接使用了。
425 0
Qt-第一个QML程序-4-自定义按钮类,动画,状态
Qt-Qml-隐藏标题栏-程序依附任务栏
最近换工作,直接欢动qml这边来了,以后可能会有更多关于qml的文章
353 0
Qt-Qml-隐藏标题栏-程序依附任务栏
Qt自定义界面类并提升(提升的窗口部件)
Qt自定义界面类并提升(提升的窗口部件)
1378 0
Qt自定义界面类并提升(提升的窗口部件)
|
开发工具 C语言
Qt编写自定义控件33-图片切换动画
一、前言 在很多看图软件中,切换图片的时候可以带上动画过渡或者切换效果,显得更人性化,其实主要还是炫一些,比如百叶窗、透明度变化、左下角飞入等,无论多少种效果,核心都是围绕QPainter来进行,将各种动画效果对应的图片的区域动态计算并绘制出来,配合以QPropertyAnimation动画属性产生线性插值,比如渐入飞入时候,可以中间快速两端慢速。
1031 1