QT quick基础:qml界面切换

需求说明,在项目开发过程中,可能会出现多个界面切换问题。再测试过程中发现,程序开始运行时,所有界面的功能逻辑都在运行,这可能导致程序开始运行时浪费性能。因此,学习找到一种方式,当前显示的界面相关功能运行,否则停止运行。因此,写这篇文章记录一下。
参考学习文档:https://blog.csdn.net/u011555996/article/details/122004214

实例中,写了两个界面,登录界面和主界面。程序运行默认显示登录界面,点击“登录页面-登录按钮”按钮,界面切换到主界面。点击“主页面-返回按钮”按钮,返回登录界面。两个界面都添加了一个定时器,方便通过日志观察每个界面运行的时机。

一、静态加载
1、隐藏法

// main.qml
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12

Window {
    visible: true
       width: 640
       height: 480
       title: qsTr("Hello World")

       // 静态
       // 主页面一开始设置"隐藏",登录成功后才显示
       MainPage {
           id: mainPage
           width: 500
           height: 350
           visible: false // 设置"隐藏"
           anchors.centerIn: parent
       }

       LoginPage {
           id: loginPage
           width: 300
           height: 200
           anchors.centerIn: parent
       }
}

// LoginPage.qml
import QtQuick 2.0
import QtQuick.Controls 2.3
Rectangle {
    width: 400
    height: 300
    color: "#051f58"
    radius: 8

    Button {
        text: "登录页面-登录按钮"
        anchors.centerIn: parent
        onClicked: {
            // 静态
            loginPage.visible = false
            mainPage.visible = true
        }
    }

    Timer {
        interval: 100; running: true; repeat: true;
        onTriggered: console.log("loginPage lili 123456");
    }
}

// MainPage.qml
import QtQuick 2.0
import QtQuick.Controls 2.3

Rectangle {
    color: "#498ff8"
    radius: 8

    Button {
        text: "主页面-返回按钮"
        anchors.centerIn: parent
        onClicked: {
            // 静态
            loginPage.visible = true
            mainPage.visible = false
        }
    }

    Timer {
        interval: 100; running: true; repeat: true;
        onTriggered: console.log("mainPage lili 123456");
    }
}

运行效果:
登录界面:
在这里插入图片描述
主界面:
在这里插入图片描述
通过运行效果可以看出,在登录界面和主界面,两个界面的功能逻辑都在运行。既程序运行后,两个界面同时加载,只是通过,界面显示和隐藏逻辑,确定哪个界面输出。

2、SwipeView
参考文章:https://blog.csdn.net/weixin_44697562/article/details/116334077
代码:

// main.qml
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12

Window {
   id: mainWin
   visible: true
   width: 640
   height: 480
   title: qsTr("Hello World")

   Item {
       anchors.fill: parent
       Rectangle{
           id:rect_BG
           anchors.fill: parent
           radius: 5
           color: "#018574"
       }


       SwipeView{
           id:swipeView
           anchors.left: parent.left
           anchors.leftMargin: 10
           anchors.right: parent.right
           anchors.rightMargin: 10
           anchors.top: parent.top
           anchors.topMargin: 50
           anchors.bottom: parent.bottom
           anchors.bottomMargin: 30

           spacing: 10

           ServerPanel{id:sp_ROOT}

           ListPanel{id:lp_ROOT}
       }

       PageIndicator{
           id:indicator
           anchors.bottom: parent.bottom
           anchors.bottomMargin: 10
           anchors.horizontalCenter: parent.horizontalCenter

           currentIndex: swipeView.currentIndex
           count:swipeView.count
       }
   }
}

// ListPanel.qml
import QtQuick 2.0
import QtQuick.Controls 2.5
Page {
    id:lp_ROOT
    background: null
    Label{
        anchors.horizontalCenter: parent.hoverEnabled
        Text {
            text: "列表界面"
            color: "white"
            font.bold: true
            font.pointSize: 14
        }
    }

    Timer {
        interval: 10; running: true; repeat: true;
        onTriggered: console.log("listPanel  123456");
    }
}

// ServerPanel.qml
import QtQuick 2.0
import QtQuick.Controls 2.5


Page {
    background: null
    Label{
        anchors.horizontalCenter: parent.hoverEnabled

        Text {
            text: "服务器界面"
            color: "white"
            font.bold: true
            font.pointSize: 14
        }
    }

    Timer {
        interval: 10; running: true; repeat: true;
        onTriggered: console.log("ServerPanel  123456");
    }
}

效果图:
在这里插入图片描述
该组件类似android的ViewPaper + fragment效果。程序开始运行,要显示的page全部加载进来。SwipeView是通过更改currentIndex来实现切换页面的,所以只需要将你的SwipeView内的id声明出来然后修改currentIndex即可。

Button{
        id:btn_Front
        text: "上一个"
        anchors.centerIn: parent
        onClicked: {
            bg_ROOT.swipeView.currentIndex -= 1
        }
    }

二、动态切换
1、使用Loader动态加载QML组件
代码:

// main.qml
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12

Window {
    visible: true
       width: 640
       height: 480
       title: qsTr("Hello World")
       
       // 动态加载
       // 1. Loader加载不同组件,实现切换页面的功能
           Loader{
               id:myLoader
               anchors.centerIn: parent // 弹出的界面都居中显示
           }
           Component.onCompleted: myLoader.sourceComponent = loginPage // 一开始显示登录页面

           // 2. 登录页面-Component
           Component{
               id:loginPage
               LoginPage {
                   width: 300
                   height: 200
                   anchors.centerIn: parent
               }
           }

           // 3.主页面-Component
           Component{
               id:mainPage
               MainPage {
                   width: 500
                   height: 350
                   anchors.centerIn: parent
               }
           }
}

// LoginPage.qml
import QtQuick 2.0
import QtQuick.Controls 2.3

Rectangle {
    width: 400
    height: 300
    color: "#051f58"
    radius: 8

    Button {
        text: "登录页面-登录按钮"
        anchors.centerIn: parent
        onClicked: {

            // 动态
            myLoader.sourceComponent = mainPage // 切换显示主页面
        }
    }

    Timer {
        interval: 100; running: true; repeat: true;
        onTriggered: console.log("loginPage lili 123456");
    }
}

// MainPage.qml
import QtQuick 2.0
import QtQuick.Controls 2.3

Rectangle {
    color: "#498ff8"
    radius: 8

    Button {
        text: "主页面-返回按钮"
        anchors.centerIn: parent
        onClicked: {

            // 动态
             myLoader.sourceComponent = loginPage // 切换显示登录页面
        }
    }

    Timer {
        interval: 100; running: true; repeat: true;
        onTriggered: console.log("mainPage lili 123456");
    }
}

运行效果:
登录界面
在这里插入图片描述
主界面
在这里插入图片描述
返回登录界面:
在这里插入图片描述
通过日志可以看出,哪个界面在前台,就运行哪个界面。

2、利用 createComponent 创建并切换
代码:

// main.qml
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12

Window {
   id: mainWin
   visible: true
   width: 640
   height: 480
   title: qsTr("Hello World")


      // 2. 利用 createComponent 创建并切换
       LoginPage {
             width: 300
             height: 200
             anchors.centerIn: parent
       }
}

// LoginPage.qml
import QtQuick 2.0
import QtQuick.Controls 2.3

Rectangle {
    id: loginPage
    width: 400
    height: 300
    color: "#051f58"
    radius: 8
    clip:true

    Button {
        text: "登录页面-登录按钮"
        anchors.centerIn: parent
        onClicked: {
            // 先隐藏登录页面
            loginPage.visible = false

            // 在主窗口上显示主页面
            var compMain = Qt.createComponent("MainPage.qml")
            .createObject(mainWin, {x:50, y:50, width:500, height:350});
        }
    }

    Timer {
        interval: 10; running: true; repeat: true;
        onTriggered: console.log("loginPage 123456");
    }
}

// MainPage.qml
import QtQuick 2.0
import QtQuick.Controls 2.3

Rectangle {
    id: mainPage
       color: "#498ff8"
       radius: 8

   Button {
       text: "主页面-返回按钮"
       anchors.centerIn: parent
       onClicked: {
           // 先隐藏主页面
           mainPage.visible = false

           // 在主窗口上显示登录页面
           var compLogin = Qt.createComponent("LoginPage.qml")
           .createObject(mainWin, {x:100, y:100, width:500, height:350});
       }
   }

    Timer {
        interval: 10; running: true; repeat: true;
        onTriggered: console.log("mainPage  123456");
    }
}

运行效果:
登录界面
在这里插入图片描述
主界面
在这里插入图片描述
返回登录界面
在这里插入图片描述
通过日志可以看出,程序运行时,只有前台界面运行。打开主界面后及返回登录界面,两个界面都在运行。

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt QML仪表Demo是一个用于展示仪表效果的示例程序,通过使用Qt框架中的QML语言进行开发。QML是一种用于构建用户界面的声明式语言,它可以与C++代码无缝交互,并且可以跨平台运行。 这个仪表Demo通常包含一个圆形的仪表盘,上面显示着一些指针和刻度,用于表示某种状态或数值。这个示例程序可以用来演示一些实际应用场景,如车辆仪表盘、仪器仪表等。 在QML文件中,我们可以定义一个圆形的画布并在上面绘制各种图形元素。例如,我们可以添加一个圆形的外环作为仪表盘的边框,然后在中间添加一个圆形的刻度盘,并绘制出不同的刻度线。接着,我们可以添加指针和数字等元素,来显示具体的数值。 在QML中,我们可以使用一些内置的属性和表达式来实现各种动画效果。比如,我们可以定义一个动画来实现指针的旋转,使其根据仪表盘上的值进行相应的角度调整。还可以通过属性绑定来实时更新仪表盘的数值显示。 除了基本的仪表功能,我们还可以通过QML的扩展性来添加更多的交互功能。例如,通过添加鼠标事件处理器或触摸事件处理器,我们可以让用户通过拖动、滑动等方式来手动调整仪表盘的数值。 总之,Qt QML仪表Demo是一个通过使用Qt框架中的QML语言开发的示例程序,用于展示仪表效果。它可以帮助开发者更好地理解和学习QML的使用方法,并将其应用于实际项目中。 ### 回答2: Qt QML仪表Demo是一个使用Qt Quick绘制仪表盘界面的示例程序。QML是一种声明性语言,用于构建基于Qt的用户界面。 该示例程序展示了如何使用QML绘制一个具有平滑动画效果的仪表盘界面。在这个示例中,仪表盘界面由一个圆形背景、一个指针和一些标签组成。 首先,通过QML的绘图元素Path绘制一个圆形背景。可以设置背景的颜色、半径和边框。然后,使用Item元素嵌套一个Rectangle元素,用作指针。可以根据仪表盘当前值计算指针的角度,并将其旋转到正确的位置。 除了绘制背景和指针,示例中还包含一些标签,用于显示仪表盘的范围和单位。这些标签可以使用Text元素和属性绑定来实现。可以根据需要设置标签的颜色、大小和位置。 示例程序还包含一些动画效果,用于平滑地过渡指针的位置。可以使用Behavior元素和属性动画来定义这些效果。例如,可以定义一个角度动画,使指针在数值改变时顺时针或逆时针旋转到新的位置。 为了实现用户交互,示例程序还使用了一些QML的交互元素,如Slider和Button。可以通过Slider来改变仪表盘的数值,从而实现指针的动态变化。而Button可以用于重置仪表盘的数值。 综上所述,Qt QML仪表Demo是一个使用Qt Quick绘制仪表盘界面的示例程序,通过展示QML的绘图元素、属性绑定、动画效果和用户交互来实现这个功能。 ### 回答3: Qt QML仪表Demo是一个基于Qt QuickQML语言编写的示例应用程序,用于展示仪表盘的功能和样式。 该示例应用程序主要由以下几个部分组成: 1. 仪表盘组件:通过使用Qt Quick Controls组件库中的样式,可以创建一个美观和交互性强的仪表盘界面。例如,可以使用圆形进度条来显示速度、转速等信息,并使用指针在刻度上指示当前数值。 2. 数据模型:为了展示仪表盘的功能,需要使用数据模型来模拟一些实际的数值。可以创建一个虚拟的数据模型,包含一些属性,如速度、转速等,并使用属性绑定机制将这些属性与仪表盘组件上的对应属性绑定起来。 3. 用户交互:通过用户交互,可以实现一些仪表盘的交互功能。例如,可以通过滑动或点击来改变仪表盘上的数值,或者通过A/B按钮来切换仪表盘的显示模式。 4. 动画效果:使用Qt Quick的动画系统,可以为仪表盘组件添加一些动画效果。例如,在数值变化时可以添加一个渐变动画效果,使仪表盘的指针从一个数值平滑过渡到另一个数值。 Qt QML仪表Demo不仅可以作为一个示例应用程序来展示如何创建仪表盘界面,还可以作为一个基础框架,用于开发具有仪表盘功能的实际应用程序。通过修改和扩展仪表盘组件、数据模型和用户交互等部分,可以满足不同应用场景的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值