Qt Quick系列(6)—多风格UI页面

这篇具有很好参考价值的文章主要介绍了Qt Quick系列(6)—多风格UI页面。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🚀作者:CAccept
🎂专栏:Qt Quick
Qt Quick系列(6)—多风格UI页面

前言

Qt Quick控件用于创建由标准化组件(如按钮、标签、滑块等)构建的用户界面。

  • QtQuick.Controls:基本控件。
  • QtQuick.Templates:为控件提供行为化的、非可化视的基本类型。
  • QtQuick.Controls.Imagine:为Imagine主题风格提供支持。
  • QtQuick.Controls.Material:为Material主题风格提供支持。
  • QtQuick.Controls.Universal:为Universal主题风格提供支持。
  • Qt.labs.platform:支持常用对话框,如文件、颜色等,以及系统图标和标准路径。

有时候我们会分不清哪个是menuBar,哪个是ToolBar,现在下面这个小小的应用程序给您答案,一定别又忘咯
Qt Quick系列(6)—多风格UI页面

在这篇文章中将会给大家分享各种”风格“的UI页面,希望您能够耐心看下去

桌面版本的UI界面

桌面版本的UI界面一般有菜单栏+工具栏+内容+提示状态栏,打开你的WPS就知道应该是什么样的啦

代码示例

要求:完成一个程序,有打开文件按钮和帮助按钮,当点击打开按钮时,会打开文件夹,当我们选中照片后,照片会在程序的中央进行显示,而点击帮助按钮则会显示一个提示框

main.qml

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.5
import Qt.labs.platform 1.0 as Platform
ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")


    background: Rectangle
    {
        color:"darkGray"
    }
    Image
    {
        id:image
        anchors.fill:parent
        //适应模式
        fillMode: Image.PreserveAspectFit
    }
	//设置工具栏ToolBar
    header:ToolBar{
        Flow{
            anchors.fill:parent
            ToolButton{
                text:"打开"
                icon.source:"images/open.png"
                //点击按钮触发打开文件夹
                onClicked: {
                    fileOpenDialog.open()
                }
            }
        }
    }
	//用于打开文件夹
    Platform.FileDialog
    {
        id:fileOpenDialog
        title:"选择照片"
        nameFilters: [
        	//用于筛选文件类型
            "Images files(*.png *jpg)","all files(*.*)"
        ]
        //点击后返回的fileOpenDialog.file就是图片路径
        onAccepted: {
            image.source = fileOpenDialog.file
        }
    }
    //设置menuBar
    menuBar:MenuBar{
        Menu{
            title:"&File"
            MenuItem{
                text:"&Open..."
                icon.source:"images/open.png"
                onTriggered: fileOpenDialog.open()
            }
        }
        Menu{
            title:"&Help"
            MenuItem{
                text:"&About..."
                icon.source:"images/open.png"
                onTriggered: aboutDialog.open()
            }
        }
    }
	//模拟”帮助对话框“
    Dialog
    {
        id:aboutDialog
        width: 300
        height: 150
        anchors.centerIn:parent
        title:"About"
        Label{
            anchors.fill:parent
            text:"这是about页面"
            horizontalAlignment: Text.AlignHCenter
        }
        //只有一个OK按钮
        standardButtons: Platform.StandardButton.Ok
    }
}

运行效果:
Qt Quick系列(6)—多风格UI页面

相关知识点

1、设置menuBar使用

menuBar:MenuBar{
		//菜单1
        Menu{
            title:"&File"
            MenuItem{
       			//子项功能
       			text:
                icon.source:
                onTriggered: 
            }
            MenuItem{
       			//子项功能
       			text:
                icon.source:
                onTriggered:
            }
        }
        //菜单2
        Menu{
            title:"&Help"
            MenuItem{
                //子项功能
       			text:
                icon.source:
                onTriggered:
            }
        }
    }

2、使用Platform.FileDialog来对文件夹进行打开选择

Platform.FileDialog
    {
        id:fileOpenDialog
        title:"选择照片"
        nameFilters: [
        	//用于筛选文件类型
            "Images files(*.png *jpg)","all files(*.*)"
        ]
        //点击后返回的fileOpenDialog.file就是文件点击后的路径
        onAccepted: {
            //相应操作
        }
    }

移动版风格的UI界面

移动版风格的UI界面一般是用侧滑菜单(Drawer)替换菜单,并且样式也一般会有所不同,接下来看我的例子吧👇

代码示例

功能还是和上面的一样只是将风格变成侧滑菜单,同样还是打开文件显示图片内容

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.5
//一些文件操作就可以用这个包
import Qt.labs.platform 1.0 as Platform
import QtQuick.Controls.Material  2.0
ApplicationWindow {
    visible: true
    width: 320
    height: 480
    title: qsTr("Hello World")


    background: Rectangle
    {
        color:"darkGray"
    }
    Image
    {
        id:image
        anchors.fill:parent
        //适应模式
        fillMode: Image.PreserveAspectFit
    }

    header:ToolBar{
        Material.background: Material.Orange
        ToolButton
        {
            icon.source: "images/baseline-menu-24px"
            onClicked: drawer.open()
        }

        Label
        {
            anchors.centerIn: parent
            text:"Image Viewer"
            font.pixelSize: 20
        }
    }
    Platform.FileDialog
    {
        id:fileOpenDialog
        title:"选择照片"
        nameFilters: [
            "Images files(*.png *jpg)","all files(*.*)"
        ]
        //点击后返回的fileOpenDialog.file就是图片路径
        onAccepted: {
            image.source = fileOpenDialog.file
        }
    }

    Drawer
    {
        id:drawer
        width:parent.width/3*2
        height: parent.height
        //ListView风格
        ListView
        {
            anchors.fill: parent
            //ListView里面要显示的数据都在model里面
            model:ListModel
            {
                ListElement
                {
                    text:"open..."
                    triggered:function()
                    {
                        fileOpenDialog.open();
                    }
                }
                ListElement
                {
                    text:"about..."
                    triggered:function()
                    {
                        aboutDialog.open();
                    }
                }
            }
            //使用delegate将model的数据进行显示
            delegate: ItemDelegate
            {
                text:model.text
                highlighted:ListView.isCurrentItem
                onClicked:{
                    drawer.close()
                    //触发triggered:function
                    model.triggered()
                }
            }

        }
    }

    Dialog
    {
        id:aboutDialog
        width: 300
        height: 150
        anchors.centerIn:parent
        title:"About"
        Label{
            anchors.fill:parent
            text:"这是about页面"
            horizontalAlignment: Text.AlignHCenter
        }
        standardButtons: Platform.StandardButton.Ok
    }
}

运行效果:
Qt Quick系列(6)—多风格UI页面


嵌套页面

我们将创建一个页面树,可以通过上级页面访问下级页面👇
Qt Quick系列(6)—多风格UI页面

该用户界面的关键组件是StackView。它允许我们将页面放在一个堆栈(stack)上,当用户想要返回时,可以弹出(pop)该堆栈,也可以压入(push)该堆栈,当哪个Page处于栈顶,那么就在主页面显示哪个Page

代码示例

先提供Home.qmlProfile.qmlAbout.qmlEditProfile.qml各个页面的实现

Home.qml

import QtQuick 2.0
import QtQuick.Controls 2.0
Page {
    title:"Home"
    Label{
        anchors.centerIn: parent
        text:"Home Screen"
    }
}

Profile.qml

import QtQuick 2.0
import QtQuick.Controls 2.0

Page {
    title: "Profile"

    Column{
        anchors.centerIn: parent
        spacing: 10
        Button{
            anchors.horizontalCenter: parent.horizontalCenter
            text:"Edit"
            //点击的话将EditProfile组件进行追加
            onClicked: stackView.push("EditProfile.qml")
        }

        Label{
            anchors.horizontalCenter: parent.horizontalCenter
            text:"Profile Screen"
        }
    }
}

EditProfile.qml

import QtQuick 2.0
import QtQuick.Controls 2.0
Page {
    title:"EditProfile"
    Column{
        spacing:10
        anchors.centerIn: parent
        Label{
            anchors.horizontalCenter: parent.horizontalCenter
            text:"EditProfile Screen"
        }

    }
}

About.qml

import QtQuick 2.0
import QtQuick.Controls 2.0
Page {
    title:"About"
    Label{
        anchors.centerIn: parent
        text:"About Screen"
    }
}

main.qml

import QtQuick 2.0
import QtQuick.Controls 2.0

ApplicationWindow {
    id:window
    width: 320
    height: 480
    visible: true
    title: qsTr("Stack")

    header:ToolBar{
        ToolButton{
            //"\u25C0"是三角形状,"\u2630"是三条杠
            text:stackView.depth>1?"\u25C0":"\u2630"
            font.pixelSize: Qt.application.font.pixelSize*1.6
            onClicked: {
                if(stackView.depth>1){
                    //页面进行弹出(回滚到上个页面)
                    stackView.pop()
                }else{
                    //如果目前只有一个Home页面就对做边框进行打开
                    drawer.open()
                }
            }
        }
        Label{
            //文本是当前页面的title
            text:stackView.currentItem.title
            anchors.centerIn: parent
        }
    }

    //左边的抽拉式页面进行打开
    Drawer{
        id:drawer
        width: window.width*0.66;height: window.height

        Column{
            anchors.fill:parent

            ItemDelegate{
                text:"Profile"
                width: parent.width
                onClicked: {
                    //使用push来让stackView进行页面插入
                    stackView.push("Profile.qml")
                    drawer.close()
                }
            }
            ItemDelegate{
                text:"About"
                width: parent.width
                onClicked: {
                    stackView.push(aboutPage)
                    drawer.close()
                }
            }
        }
    }

    StackView{
        id: stackView
        anchors.fill: parent
        //初始化页面是Home
        initialItem: Home{}
    }

    Component{
        id:aboutPage
        About{}
    }
}

运行效果:
Qt Quick系列(6)—多风格UI页面

相关知识点

1、这种嵌套式的页面使用StackView控件来实现
常用到的属性有:initialItem: 指定初始页面的项(Item)。
常用到的方法有:
push(item, properties): 将指定的项(Item)推入页面堆栈,并可以传递属性值给新的页面(属性值也可以为空)。
pop(): 从页面堆栈中弹出当前页面。
clear(): 清空页面堆栈,将堆栈恢复到初始状态,直接变成空

2、“\u25C0"是三角形状,”\u2630"是三条杠,可用作text属性的设置
Qt Quick系列(6)—多风格UI页面

Qt Quick系列(6)—多风格UI页面


并排页面

什么叫做并排页面呢,就像👇
Qt Quick系列(6)—多风格UI页面
我们创建了一个用户界面,该界面由三个页面组成,用户可以在其中切换。
Qt Quick系列(6)—多风格UI页面

代码示例

要实现并排页面,关键组件是SwipeView。而PageIndicator(底部的三个点)显示用户当前处于活动状态的页面,这有助于导航。
还是采用嵌套页面中的Home.qmlProfile.qmlAbout.qmlEditProfile.qml四个组件页面。

我们只需要将嵌套页面中的StackView控件改成SwipeView再加上PageIndicator导航就可以了,看我的main.qml就知道了👇

main.qml

import QtQuick 2.0
import QtQuick.Controls 2.0

ApplicationWindow {
    id:window
    width: 320
    height: 480
    visible: true
    title: qsTr("side by side")
    
    SwipeView{
        id: swipeView
        anchors.fill: parent
		//直接初始化四个界面
        Home{}
        About{}
        EditProfile{}
        Profile{}
    }
    //下面点点导航
    PageIndicator
    {
        anchors.bottom:parent.bottom
        anchors.horizontalCenter: parent.horizontalCenter
		//和SwipeView的各种信息进行绑定
        currentIndex: swipeView.currentIndex
        count:swipeView.count
    }

}

运行效果:

Qt Quick系列(6)—多风格UI页面

相关知识点

1、这种并排式的页面使用SwipeView控件来实现
常用到的属性有:
currentIndex: 当前显示页面的索引。
interactive: 指定是否允许用户通过手势交互来滑动页面。
orientation: 指定滑动方向,可以是 Qt.Horizontal(水平)或 Qt.Vertical(垂直)。
常用到的方法有:
setCurrentIndex(index): 将指定索引的页面设置为当前显示的页面。
文章来源地址https://www.toymoban.com/news/detail-484658.html

到了这里,关于Qt Quick系列(6)—多风格UI页面的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt6 Qt Quick UI原型学习QML第六篇

    import QtQuick 2.12 :导入QtQuick模块的版本2.12,用于创建Qt快速应用程序的用户界面。 import QtQuick.Window 2.12 :导入QtQuick.Window模块的版本2.12,用于创建窗口对象。 import QtQuick.Controls 2.12 :导入QtQuick.Controls模块的版本2.12,用于创建用户界面控件。 Window {} :定义了一个窗口对象,

    2024年02月16日
    浏览(49)
  • Qt6 Qt Quick UI Prototype学习QML第一篇

    创建一个具有QML入口点的Qt Quick 2 UI项目。要使用它,您需要设置一个QML运行时环境,例如gmlscene。 仅当您正在进行原型设计时才使用此功能。您无法使用此创建完整的应用程序。请考虑使用Qt Quick application项目 Qt Quick UI原型主要用于快速创建交互式的用户界面(UI)原型。它

    2024年02月16日
    浏览(49)
  • Qt Quick系列(7)—Model-View

    🚀作者:CAccept 🎂专栏:Qt Quick 在QML中,model和view由delegate连接,他们的关系如下👇 1、delegate 属性:delegate知道model的内容以及如何可视化它- 怎么显示 。 2、view知道delegate的概念以及如何布置它们- 怎么摆放 。 3、model属性:model只知道它所表示的数据- 要显示的内容集合 。

    2024年02月12日
    浏览(38)
  • Qt Quick 项目(第二集Qt Quick Application创建)

    上集回顾 Qt Quick 项目(第一集Qt Quick UI 项目项目创建)     如果将程序的用户界面称为前端,将程序中的数据存储和业务逻辑称为后端,那么传统Qt应用程序的前端和后端都是使用C++来完成的。对于现代软件开发而言,这里有一个存在已久的冲突:前端的演化速度要远快于后

    2024年01月25日
    浏览(40)
  • Qt Quick程序的发布|Qt5中QML和Qt Quick 的更改

    # Quick程序的发布旧版做法 # Qt5中QML和Qt Quick 的更改 1.QML语言的更改(Qt4-Qt5)     在QML语言中,只有少量更改会影响QML代码的迁移:无法直接导入单独的文件(例如:import\\\"MyType.qml”),需要导人该文件所在的目录;     JavaScript文件中的相对路径被解析为相对于该JavaScrip

    2024年01月25日
    浏览(50)
  • QT Quick之quick与C++混合编程

            Qt quick能够生成非常绚丽界面,但有其局限性的,对于一些业务逻辑和复杂算法,比如低阶的网络编程如 QTcpSocket ,多线程,又如 XML 文档处理类库 QXmlStreamReader / QXmlStreamWriter 等等,在 QML 中要么不可用,要么用起来不方便,所以就有了quick和C++混合编程的需求。

    2024年02月12日
    浏览(41)
  • 【Qt之Quick模块】8. Quick基础、布局管理、布局管理器

    Qt Quick编程,提供了多种布局方式。 如,静态布局,可以使用组件的x、y属性进行设置,或者进行绑定。 还可以使用锚anchors进行布局。 此外,还可以使用定位器以及定位管理器为多组件进行布局。 但使用布局管理器和锚会占用内存和实例化时间,若使用x、y、width、height等属

    2024年01月25日
    浏览(35)
  • Qt Quick - StackView

    StackView可以与一组相互链接的信息页面一起使用。例如,电子邮件应用程序具有单独的视图,以列出最新的电子邮件,查看特定的电子邮件和列表/查看附件。当用户打开电子邮件时,电子邮件列表视图被压入栈中,当用户选择返回时,电子邮件列表视图又被弹出。 下面的代

    2023年04月17日
    浏览(86)
  • Qt Quick 3D简介

    Qt Quick 3D是Qt自带的一套3D图形系统,与传统的Qt 3D不同的是,Qt Quick 3D采用QML来进行开发。本节则对Qt Quick 3D进行一次简单的介绍。 在main.qml中设置整个场景(entire scene)。 在使用Qt Quick 3D之前,为了能够使用QtQuick3D模块中的类型,我们必须导入它: 为了绘制任何3D场景,我们需

    2024年02月13日
    浏览(34)
  • Qt Quick - 容器控件综述

    Qt Quick Controls提供了一系列类似容器的控件。 控件 功能 ApplicationWindow 支持页眉和页脚的样式顶级窗口 Container 提供容器通用功能的抽象基类型 Frame 一组逻辑控件的可视框架 GroupBox 逻辑控件组的可视框架和标题 Page 支持页眉和页脚的样式页面控件 Pane 提供与应用程序样式和主

    2023年04月26日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包