QML 界面切换的几种方法

静态

一、隐藏法

本质上各页面都存在,只是某些隐藏,某些显示,当某一触发条件满足时,设置对应页面的显示和隐藏。


    
    
  1. main.qml
  2. ------------------------------------
  3. import QtQuick 2.9
  4. import QtQuick.Window 2.2
  5. Window {
  6. visible: true
  7. width: 640
  8. height: 480
  9. title: qsTr( "Hello World")
  10. // 主页面一开始设置 "隐藏",登录成功后才显示
  11. MainPage {
  12. id: mainPage
  13. width: 500
  14. height: 350
  15. visible: false // 设置 "隐藏"
  16. anchors.centerIn: parent
  17. }
  18. LoginPage {
  19. id: loginPage
  20. width: 300
  21. height: 200
  22. anchors.centerIn: parent
  23. }
  24. }
  25. LoginPage.qml
  26. ------------------------------------
  27. import QtQuick 2.0
  28. import QtQuick.Controls 2.3
  29. Rectangle {
  30. width: 400
  31. height: 300
  32. color: "#051f58"
  33. radius: 8
  34. Button {
  35. text: "登录页面-登录按钮"
  36. anchors.centerIn: parent
  37. onClicked: {
  38. loginPage.visible = false
  39. mainPage.visible = true
  40. }
  41. }
  42. }
  43. MainPage.qml
  44. ------------------------------------
  45. import QtQuick 2.0
  46. import QtQuick.Controls 2.3
  47. Rectangle {
  48. color: "#498ff8"
  49. radius: 8
  50. Button {
  51. text: "主页面-返回按钮"
  52. anchors.centerIn: parent
  53. onClicked: {
  54. loginPage.visible = true
  55. mainPage.visible = false
  56. }
  57. }
  58. }

二、利用 StackView、SwipeView

参考:Qt Quick之StackView详解(1)

动态

一、使用Loader动态加载QML组件

Loader 元素用来动态加载可见的 QML 组件,它可以加载一个 QML 文件(使用 source 属性)或者一个组件对象(使用 sourceComponent 属性)。具体可以参考:QML 使用Loader动态加载组件

代码如下:


    
    
  1. main .qml
  2. ------------------------------------
  3. import QtQuick 2.9
  4. import QtQuick .Window 2.2
  5. Window {
  6. visible: true
  7. width: 640
  8. height: 480
  9. title: qsTr( "Hello World")
  10. // 1. Loader加载不同组件,实现切换页面的功能
  11. Loader{
  12. id:myLoader
  13. anchors.centerIn: parent // 弹出的界面都居中显示
  14. }
  15. Component .onCompleted: myLoader.sourceComponent = loginPage // 一开始显示登录页面
  16. // 2. 登录页面-Component
  17. Component{
  18. id:loginPage
  19. LoginPage {
  20. width: 300
  21. height: 200
  22. anchors.centerIn: parent
  23. }
  24. }
  25. // 3.主页面-Component
  26. Component{
  27. id:mainPage
  28. MainPage {
  29. width: 500
  30. height: 350
  31. anchors.centerIn: parent
  32. }
  33. }
  34. }
  35. LoginPage .qml
  36. ------------------------------------
  37. import QtQuick 2.0
  38. import QtQuick .Controls 2.3
  39. Rectangle {
  40. width: 400
  41. height: 300
  42. color: "#051f58"
  43. radius: 8
  44. Button {
  45. text: "登录页面-登录按钮"
  46. anchors.centerIn: parent
  47. onClicked: myLoader.sourceComponent = mainPage // 切换显示主页面
  48. }
  49. }
  50. MainPage .qml
  51. ------------------------------------
  52. import QtQuick 2.0
  53. import QtQuick .Controls 2.3
  54. Rectangle {
  55. color: "#498ff8"
  56. radius: 8
  57. Button {
  58. text: "主页面-返回按钮"
  59. anchors.centerIn: parent
  60. onClicked: myLoader.sourceComponent = loginPage // 切换显示登录页面
  61. }
  62. }

二、利用 createComponent 创建并切换


    
    
  1. main. qml
  2. ------------------------------------
  3. import QtQuick 2.9
  4. import QtQuick. Window 2.2
  5. Window {
  6. id: mainWin
  7. visible: true
  8. width: 640
  9. height: 480
  10. title: qsTr( "Hello World")
  11. LoginPage {
  12. width: 300
  13. height: 200
  14. anchors. centerIn: parent
  15. }
  16. }
  17. LoginPage. qml
  18. ------------------------------------
  19. import QtQuick 2.0
  20. import QtQuick. Controls 2.3
  21. Rectangle {
  22. id: loginPage
  23. width: 400
  24. height: 300
  25. color: "#051f58"
  26. radius: 8
  27. clip: true
  28. Button {
  29. text: "登录页面-登录按钮"
  30. anchors. centerIn: parent
  31. onClicked: {
  32. // 先隐藏登录页面
  33. loginPage. visible = false
  34. // 在主窗口上显示主页面
  35. var compMain = Qt. createComponent( "MainPage.qml")
  36. . createObject(mainWin, { x: 50, y: 50, width: 500, height: 350});
  37. }
  38. }
  39. }
  40. MainPage. qml
  41. ------------------------------------
  42. import QtQuick 2.0
  43. import QtQuick. Controls 2.3
  44. Rectangle {
  45. id: mainPage
  46. color: "#498ff8"
  47. radius: 8
  48. Button {
  49. text: "主页面-返回按钮"
  50. anchors. centerIn: parent
  51. onClicked: {
  52. // 先隐藏主页面
  53. mainPage. visible = false
  54. // 在主窗口上显示登录页面
  55. var compLogin = Qt. createComponent( "LoginPage.qml")
  56. . createObject(mainWin, { x: 100, y: 100, width: 500, height: 350});
  57. }
  58. }
  59. }

本来应该使用compLogin.destroy()来销毁登录页面以达到关闭的效果,同时节省内存,奈何学艺不精试了下没有实现好,故先暂时使用"隐藏"的方法。

使用场景分析

如果想记录上一页的操作,可以使用静态的方式,比如设置用户名的页面,切换到下一页,但也可能返回到上一页。

如果想每次进入页面时,一切从新开始,不想记录任何信息,则使用动态方式。比如登录类切换,登录后一切都应该从新开始。

</article>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QML中,ListView是一种非常常用的QML组件,用于以列表形式展示数据。ListView可以使用不同的数据模型来提供数据,从而实现灵活的数据展示和交互。 以下是几种常见的ListView数据模型: 1. ListModel模型:这是最常用的数据模型之一,它允许我们通过添加项目来动态修改和管理数据。可以通过在ListView外部创建一个ListModel对象,并将该对象作为ListView的model属性来实现。ListModel对象中的每个项目都可以通过属性定义。可以使用JavaScript的API来操作ListModel的项目,如添加、删除、移动等。 2. ArrayDataModel模型:这种数据模型适用于静态数据。在QML中,我们可以使用JavaScript数组来初始化数据,并将该数组作为ListView的model属性值。此模型基于JavaScript数组,并且不允许对数据进行修改。如果需要对数据进行更改,需要先将数组中的数据复制到一个新的数组,然后将新数组作为model。 3. XmlListModel模型:这个模型是XML数据源的绑定模型。它可以从远程或本地XML文件中提取数据,并在ListView中展示。可以在XmlListModel中指定XML文件的路径,然后使用XmlRole来定义需要展示的数据。XmlListModel可以通过一系列XPath表达式来过滤和排序数据。 4. SqlListModel模型:这个模型是用于绑定SQL数据库的数据模型。可以通过指定SQL查询语句来从数据库中获取数据,并在ListView中展示。可以使用roleNames属性来定义在ListView中展示哪些数据。SqlListModel还具有数据过滤和排序功能。 总的来说,QML中的ListView可以使用多种数据模型来展示不同类型的数据。无论是动态数据还是静态数据,XML数据源还是SQL数据库,都可以通过适当选择数据模型来满足个性化的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值