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界面(可动态覆盖整个窗口)
|
4月前
|
搜索推荐
【qt】自定义界面类
【qt】自定义界面类
36 0
QT之Qml使用QSystemTrayIcon实现系统托盘
QT之Qml使用QSystemTrayIcon实现系统托盘
|
C++ Windows
Qt-QML-Popup,弹层界面编写
随着接触Qt的时间的增加,也逐渐的发现了Qt 的一些不人信话的一些地方,不由的想起一句话,也不知道是在哪里看到的了“一切变成语言都是垃圾,就C++还可以凑合用”大致意思是这样。最近项目的祝界面框架都基本写完了,那自我感觉良好,感觉自己QML的不得了了,全部用的都是自己YY出来的空间,今天小伙伴在同伴代码后,用到了我的模块,给我说了一个BUG,
521 0
Qt-QML-Popup,弹层界面编写
Qt-第一个QML程序-4-自定义按钮类,动画,状态
上篇中,我们写到了自己定义了一个按钮,但是呢,按照这样的写法,要写一个程序出来,那要累死了,所以,qml给我的感觉就是各种随便调用,所以了,可以自己写一个自己Button的qml,这样在以后用到了,就可以直接使用了。
405 0
Qt-第一个QML程序-4-自定义按钮类,动画,状态
Qt-Qml-隐藏标题栏-程序依附任务栏
最近换工作,直接欢动qml这边来了,以后可能会有更多关于qml的文章
336 0
Qt-Qml-隐藏标题栏-程序依附任务栏
Qt自定义界面类并提升(提升的窗口部件)
Qt自定义界面类并提升(提升的窗口部件)
1318 0
Qt自定义界面类并提升(提升的窗口部件)
|
程序员
Qt编写自定义控件63-水波效果
一、前言 几年前就一直考虑过写这个控件了,在9年前用C#的时候,就看到过别人用C#写了个水波效果的控件,挺好玩的,当时看了下代码用的二维数组来存储变换的图像像素数据,自从学了Qt以后,有过几次想要用Qt写一个版本,当时功力尚浅,尝试过了没写成功,我记得还有个用汇编写的dll提供调用,那个效率贼高,用CPU绘制的话效率相对来说低很多。
1291 0
|
XML 程序员 C语言
Qt编写控件属性设计器2-拖曳控件
一、前言 上一篇文章把插件加载好了,并且把插件中的所有控件都显示到了列表框中,这次要做的就是实现拖曳控件的功能,用户选择一个控件拖曳到画布上,松开,在松开位置处自动实例化该控件,这个需要用到dropEvent和dragEnterEvent事件,重新实现这两个事件,对拖曳的对象进行过滤并调用函数实例化该控件,在实例化该控件的同时实例化控件跟随控件以便拉伸调整大小和位置。
907 0
|
程序员 开发工具 C语言
Qt编写自定义控件42-开关按钮
一、前言 从2010年进入互联网+智能手机时代以来,各种各样的APP大行其道,手机上面的APP有很多流行的元素,开关按钮个人非常喜欢,手机QQ、360卫士、金山毒霸等,都有很多开关控制一些操作,在Qt widgets应用项目上,在项目中应用些类似的开关按钮,估计也会为项目增添不少新鲜感。
1410 0