Qt5开发及实例V2.0-第二十二章-Qt.Quick Controls 2新颖界面开发

Qt5开发及实例V2.0-第二十二章-Qt.Quick Controls 2新颖界面开发

  • 第22章 Qt Quick Controls 2新颖界面开发
    • 22.1 Qt Quick Controls 2简介
      • 22.1.1 第一个Qt Quick Controls 2程序
      • 22.1.2 Qt Quick Controls 2程序的构成
    • 22.2 Qt Quick Controls 2与1的比较
      • 22.2.1 ApplicationWindow结构不同
      • 22.2.2 Menu不支持窗口主菜单
      • 22.2.3 控件实现差异
    • 22.3 滑动翻页及隐藏面板
    • 22.4 选项列表
    • 22.5 带功能按钮的列表
  • 本章相关例程源码下载
    • 1.Qt5开发及实例_CH2201.rar 下载
    • 2.Qt5开发及实例_CH2201-a1.rar 下载
    • 3.Qt5开发及实例_CH2201-a2.rar 下载
    • 4.Qt5开发及实例_CH2201-a3.rar 下载
    • 5.Qt5开发及实例_CH2201-a4.rar 下载
    • 6.Qt5开发及实例_CH2202.rar 下载
    • 7.Qt5开发及实例_CH2203.rar 下载
    • 8.Qt5开发及实例_CH2204.rar 下载

第22章 Qt Quick Controls 2新颖界面开发

22.1 Qt Quick Controls 2简介

(1)大部分控件的内部状态使用C++而非QML处理,以提高效率。
(2)样式类型不再提供可被控件动态实例化的组件,但控件自身由可被替换的项目委托(item delegates)组成。事实上,这意味着委托(delegates)成为Qt Quick项目,被实例化为控件的属性并与所在控件形成简单的父子关系。
(3)程序模块化和简单化。当需要将多个控件复合成一个控件时,往往将它们分隔进独立的构建代码块中,例如,一个典型的复合滚动条视图控件代码:

ScrollView {horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOffFlickable {// …}
}

它可以通过替换可绑定到任何Flickable的简单ScrollBar/ScrollIndicator控件来合成得到,如下:

Flickable {// …ScrollBar.vertical: ScrollBar { }
}

Qt Quick Controls 1与2的API特性对比见表22.1(其中,“√”表示支持,数字标注说明见表格下方)
在这里插入图片描述

  1. 无官方公开支持,但技术上可能通过私有API实现。
  2. 只有特殊样式的主题能在运行时改变,而样式是固定不变的。
  3. 性能尚未优化

22.1.1 第一个Qt Quick Controls 2程序

【例】(简单)(CH2201)本章依然从一个简单的程序入手,系统地介绍Qt Quick Controls 2开发的基础知识。创建Qt Quick Controls 2程序,步骤如下。
(1)启动Qt Creator,单击主菜单“文件”→“新建文件或项目…”项,弹出“New File or Project”对话框,选择项目“Application”下的“Qt Quick Controls 2 Application”模板,如图22.1所示。
在这里插入图片描述

(2)单击“Choose…”按钮,在“Qt Quick Controls 2 Application”对话框的“Project Location”页输入项目名称“Qcontrol2Demo”,并选择保存项目的路径,如图22.2所示。
在这里插入图片描述
(3)单击“下一步”按钮,在“Define Project Details”页选择Qt Quick Controls 2样式类型为“Default”,如图22.3所示。
在这里插入图片描述

(4)单击“下一步”按钮,在“Kit Selection”页系统默认已指定程序的编译器和调试器,直接单击“下一步”按钮,如图22.4所示。
在这里插入图片描述

(5)接下来的“Project Management”页自动汇总出要添加到该项目的文件,如图22.5所示。单击“完成”按钮完成Qt Quick Controls 2应用程序的创建。
在这里插入图片描述
单击 运行程序,出现“Hello World”窗口。该窗口包含两个标签页“First”和“Second”,其中“First”页上有一个按钮“Press Me”和一个文本框,在文本框中输入“Hello World”,单击“Press Me”按钮,在开发环境底部“应用程序输出”子窗口显示“Button Pressed. Entered text: Hello World”,如图22.6所示。
在这里插入图片描述

22.1.2 Qt Quick Controls 2程序的构成

上面这个程序是由Qt Creator环境自动生成的,是一个典型的Qt Quick Controls 2应用程序,展开项目视图可以看到其目录结构,如图22.7所示,主要有三个文件:main.qml、Page1.qml和Page1Form.ui.qml。
在这里插入图片描述

1.main.qml
项目启动的主程序文件main.qml,代码。
2.Page1.qml
Page1.qml文件中只有一个Page1Form元素,它是项目默认Page1页面的主窗体元素,一般用来存放Page1页上各控件的事件处理代码,在本项目中是“Press Me”按钮的单击(onClicked)事件代码,如下:

import QtQuick 2.7
Page1Form {button1.onClicked: {console.log("Button Pressed. Entered text: " + textField1.text);}
}

3.Page1Form.ui.qml
Page1Form.ui.qml是默认Page1页的主窗体实现文件,代码如下:

import QtQuick 2.7
import QtQuick.Controls 2.0			//导入Qt Quick Controls 2.0库
import QtQuick.Layouts 1.0			//导入Qt Quick布局库Item {					//QML通用的根元素/* 定义属性别名,为在其他.qml文件中引用这2个控件 */property alias textField1: textField1property alias button1: button1RowLayout {					//水平布局anchors.horizontalCenter: parent.horizontalCenter//在页面上居中anchors.topMargin: 20				//距顶部20像素anchors.top: parent.top				//顶端对齐TextField {					//文本框控件id: textField1placeholderText: qsTr("Text Field")}Button {					//按钮控件id: button1text: qsTr("Press Me")}}
}

4.界面主题样式
Qt Quick Controls 2支持三种类型的界面主题样式:Default(默认)、Material(质感)和普通(Universal),之前创建项目工程时选择的是默认样式(图22.3),可通过修改项目的qtquickcontrols2文件配置来更换样式类型。
qtquickcontrols2 .conf文件内容如下:

;This file can be edited to change the style of the application
;See Styling Qt Quick Controls 2 in the documentation for details:
;http://doc.qt.io/qt-5/qtquickcontrols2-styles.html[Controls]
Style=Default[Universal]
Theme=Light
;Accent=Steel[Material]
Theme=Light
;Accent=BlueGrey
;Primary=BlueGray

其中,加黑处即需要修改配置的地方。将其改为Material,运行程序,看到质感的界面如图22.8所示;若改为Universal,则呈现的界面如图22.9所示。
在这里插入图片描述

22.2 Qt Quick Controls 2与1的比较

22.2.1 ApplicationWindow结构不同

在Qt Quick Controls 1中,主应用窗口ApplicationWindow由菜单栏(Menu Bar)、工具栏(Tool Bar)、内容显示区(Content Area)和底部状态栏(Status Bar)等构成,而Qt Quick Controls 2的主应用窗口结构则要简单得多,它仅由头部(Header)、内容(Content)和尾部(Footer)三部分组成,两者的区别如图22.10所示。
在这里插入图片描述
在Qt Quick Controls 2中,一般声明ApplicationWindow为整个应用的根元素,其最简单的代码形式如下:

import QtQuick.Controls 2.1
ApplicationWindow {visible: trueheader: ToolBar {// ...}footer: TabBar {// ...}SwipeView {anchors.fill: parent// ...}
}

1.ToolBar工具栏
【例】(简单)(CH2201-a1)工具栏。
ToolBar是应用广泛的上下文相关控件(如导航按钮、搜索框等)的容器,其典型代码。
运行效果如图22.11所示。
在这里插入图片描述
2.TabBar选项标签栏
【例】(简单)(CH2201-a2)标签栏。
Qt Quick Controls 2使用TabBar/TabButton控件组合来实现页面选项标签栏,以取代原Qt Quick Controls 1中TabView/Tab组合的功能。代码的形式如下:

TabBar {// ...width: parent.widthTabButton {text: "FirstTab"// ...}TabButton {text: "SecondTab"// ...}TabButton {text: "ThirdTab"// ...}
}

一旦所有选项标签的宽度和加起来超过了屏幕宽度,标签栏就会自适应调整为可滑动切换状态,代码如下。

ApplicationWindow {visible: truewidth: 240height: 480title: qsTr("标签栏")header: TabBar {id: barwidth: parent.widthRepeater {model: ["第一页", "第二页", "第三页", "第四页", "第五页"]TabButton {text: modelDatawidth: Math.max(100, bar.width / 5)}}}
}

运行效果如图22.12所示。
在这里插入图片描述

22.2.2 Menu不支持窗口主菜单

【例】(简单)(CH2201-a1续)一个典型的工具栏弹出式菜单的例子。
代码如下。
运行程序,单击工具栏上右侧的 按钮,弹出菜单如图22.13所示。
在这里插入图片描述

22.2.3 控件实现差异

1.ButtonGroup取代ExclusiveGroup组框
在原Qt Quick Controls 1中,成组的选项按钮由ExclusiveGroup组织在一起,例如21.2.2“学生信息表单”实例(实例文件CH2102)中,有如下代码:

GroupBox {				/* 组框 */id: group1title: qsTr("性别")Layout.fillWidth: trueRowLayout {				ExclusiveGroup { id: sexGroup }	/* 互斥选项组*/RadioButton {			/* 单选按钮 */text: qsTr("男")checked: trueexclusiveGroup: sexGroupLayout.minimumWidth: 65		//设置控件所占最小宽度为65}RadioButton {text: qsTr("女")exclusiveGroup: sexGroupLayout.minimumWidth: 65}}
}

这段代码实现了“性别”单选按钮组,而在Qt Quick Controls 2中,单选按钮组改由ButtonGroup组织,如下:

GroupBox {				/* 组框 */id: group1title: qsTr("性别")Layout.fillWidth: trueRowLayout {				ButtonGroup { id: sexGroup }		/* 互斥选项组*/RadioButton {			/* 单选按钮 */text: qsTr("男")checked: trueButtonGroup.group: sexGroupLayout.minimumWidth: 65		//设置控件所占最小宽度为65}RadioButton {text: qsTr("女")ButtonGroup.group: sexGroupLayout.minimumWidth: 65}}
}

2.TextArea滚动条实现方式不一样
在Qt Quick Controls 1中,TextArea组件继承自ScrollView,因此始终自带滚动条;而在Qt Quick Controls 2中,TextArea只是个简单的多行文本编辑器,可选择性地绑定到滑动页组件以提供滚动条功能。这样就可以在带滚动条的页面上使用TextArea而不会出现双重滚动区域嵌套的情形,从而避免了不确定性和由此带来的可用性问题。将TextArea绑定到一个滑动页组件的典型代码如下:

Flickable {id: flickableanchors.fill: parentTextArea.flickable: TextArea {text: "TextArea\n...\n...\n...\n...\n...\n...\n"wrapMode: TextArea.Wrap}ScrollBar.vertical: ScrollBar { }
}

3.新增Tumbler翻选框控件
【例】(简单)(CH2201-a3)翻选框控件使用。
实现步骤如下。
(1)新建Qt Quick Controls 2应用程序,项目名称为“TumblerDialog”。
(2)打开main.qml文件,修改代码如下:
程序运行效果如图22.14所示。
在这里插入图片描述

4.一些界面控件显示风格的差异
【例】(简单)(CH2201-a4)部分控件对比显示效果。
创建一个Qt Quick Controls 2应用程序,打开main.qml文件,编写代码如下:
运行程序,效果如图22.15所示。
在这里插入图片描述

22.3 滑动翻页及隐藏面板

【例】(难度中等)(CH2202)制作一个艺术品欣赏程序,采用多页面,每一页显示一幅艺术品图片,以及品名、作者、创作年代信息,单击界面下方的滑动点来切换页面,如图22.16所示。
在这里插入图片描述

每件艺术品还附带有详细的介绍信息,在界面右侧的隐藏面板内,用户可随时拉出来查看,运行效果如图22.17所示。
在这里插入图片描述

实现步骤如下。
(1)新建Qt Quick Controls 2应用程序,项目名称为“ArtView”。
(2)在项目工程目录中建一个images文件夹,其中放入本例要用到的三张图片,文件名为“蒙娜丽莎.jpg”、“大卫.jpg”、“圣母.jpg”。
(3)右击项目视图“资源”→“qml.qrc”下的“/”节点,选择“添加现有文件…”项,从弹出对话框中选择这些图片打开,将它们加载到项目中。
(4)双击项目视图打开Page1Form.ui.qml文件,编写代码。
(5)打开Page1.qml文件,编写代码。
(6)打开main.qml文件,修改代码。

22.4 选项列表

【例】(难度中等)(CH2203)实现一个图书选择浏览程序,采用选项列表的形式,界面左边是所有书名的列表,用户选中的项以淡灰色背景突出显示,同时在右边图片框中显示对应该书的封面图片,运行效果如图22.18所示。
在这里插入图片描述
实现步骤如下。
(1)新建Qt Quick Controls 2应用程序,项目名称为“BookView”。
(2)在项目工程目录中建一个images文件夹,其中放入本例要用到的所有图书的封面图片。
(3)右击项目视图“资源”→“qml.qrc”下的“/”节点,选择“添加现有文件…”项,从弹出对话框中选择这些图片打开,将它们加载到项目中。
(4)双击项目视图打开Page1Form.ui.qml文件,将原有界面上的默认控件元素的代码注释掉:

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0Item {/*...*/
}

(5)打开Page1.qml文件,将其中button1.onClicked事件处理代码注释掉:

import QtQuick 2.7
Page1Form {/*...*/
}

(6)打开main.qml文件,修改代码。

22.5 带功能按钮的列表

【例】(较难)(CH2204)实现一个购书程序,依然采用选项列表的形式,但在列表的每个书目上增加“购买”和“移除”两个按钮,初始时两按钮均隐藏不可见,向左滑动条目才能呈现出来,单击“购买”按钮,在列表下方图片框中加载所购书的封面图片,单击“移除”按钮,则删除该书目,如图22.19所示。
在这里插入图片描述
单击封面图片右边的“结账”按钮,弹出组框供用户选择付款方式,运行效果如图22.20所示。
在这里插入图片描述
实现步骤如下。
(1)新建Qt Quick Controls 2应用程序,项目名称为“BookBuy”。
(2)在项目工程目录中建一个images文件夹,其中放入本例要用到的所有图书的封面图片。
(3)右击项目视图“资源”→“qml.qrc”下的“/”节点,选择“添加现有文件…”项,从弹出对话框中选择这些图片打开,将它们加载到项目中。
(4)分别打开项目中的Page1Form.ui.qml和Page1.qml文件,将原有的一部分默认代码注释掉(注释的方式同前例CH2203),从略。
(5)打开main.qml文件,修改代码。



本章相关例程源码下载

1.Qt5开发及实例_CH2201.rar 下载

Qt5开发及实例_CH2201.rar

2.Qt5开发及实例_CH2201-a1.rar 下载

Qt5开发及实例_CH2201-a1.rar

3.Qt5开发及实例_CH2201-a2.rar 下载

Qt5开发及实例_CH2201-a2.rar

4.Qt5开发及实例_CH2201-a3.rar 下载

Qt5开发及实例_CH2201-a3.rar

5.Qt5开发及实例_CH2201-a4.rar 下载

Qt5开发及实例_CH2201-a4.rar

6.Qt5开发及实例_CH2202.rar 下载

Qt5开发及实例_CH2202.rar

7.Qt5开发及实例_CH2203.rar 下载

Qt5开发及实例_CH2203.rar

8.Qt5开发及实例_CH2204.rar 下载

Qt5开发及实例_CH2204.rar

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/86866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

紫光展锐6nm国产5G处理器T820_国产手机芯片5G方案

紫光展锐T820是一款采用先进6nm EUV工艺的芯片,采用134三丛集八核心CPU架构,由1个主频为 2.7GHz 的 Arm Cortex-A76 大核和 3个主频为2.3GHz 的Arm Cortex-A76大核以及4个主频为2.1GHz的 Arm Cortex-A55组成 ,支持高达3MB 三级缓存&#xff0…

MySQL 篇

目录 1、数据库三范式 2、数据库事务的特性 3、MySQL数据库引擎 4、说说 InnoDB 与 MyISAM 的区别 5、索引是什么? 6、索引数据结构 7、MySQL 索引类型有哪些? 8、索引有什么优缺点? 9、索引设计原则 9、使用索引应该注意些什…

ubuntu 开启笔记本摄像头并修复画面颠倒问题

文章目录 基本环境状况: 没找到摄像头检查 opencv检查系统应用 键盘右侧,硬件层面开启摄像头画面镜像问题 基本环境 笔记本: 联想拯救者 系统: ubuntu 22.04 状况: 没找到摄像头 检查 opencv 使用 cv::VideoCaptu…

实验室安全教育与考试

目录 我的错题(2个)新知识题目(10个)刚开始不太理解的题目(10个)写在最后(免责声明) 我的错题(2个) 18.发生电气火灾时可以使用的灭火设备包括:&…

【100天精通Python】Day65:Python可视化_Matplotlib3D绘图mplot3d,绘制3D散点图、3D线图和3D条形图,示例+代码

1 mpl_toolkits.mplot3d 功能介绍 mpl_toolkits.mplot3d 是 Matplotlib 库中的一个子模块,用于绘制和可视化三维图形,包括三维散点图、曲面图、线图等。它提供了丰富的功能来创建和定制三维图形。以下是 mpl_toolkits.mplot3d 的主要功能和功能简介&am…

《动手学深度学习 Pytorch版》 7.1 深度卷积神经网络(AlexNet)

7.1.1 学习表征 深度卷积神经网络的突破出现在2012年。突破可归因于以下两个关键因素: 缺少的成分:数据 数据集紧缺的情况在 2010 年前后兴起的大数据浪潮中得到改善。ImageNet 挑战赛中,ImageNet数据集由斯坦福大学教授李飞飞小组的研究人…

js对象属性

在面向对象的语言中有一个标志,那就是都有类,通过类可以创建任意多个相同属性、方法的对象。在js中没有类的存在,所以js中的对象,相对于类语言中对象有所不同。 js中定义对象为:“无序属性的集合,其属性可…

虹科案例 | LIN/CAN总线汽车零部件测试方案

文章来源:虹科汽车电子 点此阅读原文 虹科的LIN/CAN总线汽车零部件测试方案是一款优秀的集成套装,基于Baby-LIN系列产品,帮助客户高效完成在测试、生产阶段车辆零部件质量、功能、控制等方面的检测工作。 1、汽车零部件测试的重要性&#xf…

乐鑫科技全球首批支持蓝牙 Mesh Protocol 1.1 协议

乐鑫科技 (688018.SH) 非常高兴地宣布,其自研的蓝牙 Mesh 协议栈 ESP-BLE-MESH 现已支持最新蓝牙 Mesh Protocol 1.1 协议的全部功能,成为全球首批在蓝牙技术联盟 (Bluetooth SIG) 正式发布该协议之前支持该更新的公司之一。这意味着乐鑫在低功耗蓝牙无线…

【Java 基础篇】Java Stream 流详解

Java Stream(流)是Java 8引入的一个强大的新特性,用于处理集合数据。它提供了一种更简洁、更灵活的方式来操作数据,可以大大提高代码的可读性和可维护性。本文将详细介绍Java Stream流的概念、用法和一些常见操作。 什么是Stream…

API网关是如何提升API接口安全管控能力的

API安全的重要性 近几年,越来越多的企业开始数字化转型之路。数字化转型的核心是将企业的服务、资产和能力打包成服务(服务的形式通常为API,API又称接口,下文中提到的API和接口意思相同),从而让资源之间形…

怎么在OPPO手机桌面上添加文字?便签桌面插件添加教程

很多年轻女性在选择手机时,都比较青睐于设计时尚靓丽、轻薄且续航好、系统流畅、拍照清晰的OPPO手机,并且OPPO为不同的用户提供了高中低不同价格档位的手机型号,能够满足绝大多数女性消费者的使用需求。 不过有不少OPPO手机用户表示&#xf…

关于项目、项目集、项目组合以及运营管理之间的关系

什么是项目? 【项目】这个名词,其实各位一点都不陌生,各位从小到大在各种报章杂志,甚至是每晚的新闻播报里面,每每都会看到或是听到【项目】这个词语,甚至在各位进入大学,或是研究生的阶段里就…

基于人脸5个关键点的人脸对齐(人脸纠正)

摘要:人脸检测模型输出人脸目标框坐标和5个人脸关键点,在进行人脸比对前,需要对检测得到的人脸框进行对齐(纠正),本文将通过5个人脸关键点信息对人脸就行对齐(纠正)。 一、输入图像…

ORB-SLAM2实时稠密地图,解决运行报段错误(核心已转储)运行数据集时出现段错误,出现可视化界面后闪退(添加实时彩色点云地图+保存点云地图)

高翔的稠密建图仓库 1. git clone https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map.git 2. 去ORB SLAM2里拷贝Vocabulary到/home/cgm/ORBSLAM2_with_pointcloud_map/ORB_SLAM2_modified文件夹下 3. 删除一些build文件夹 删除ORB_SLAM2_modified/Thirdparty/DB…

哈希 -- 位图、布隆过滤器、海量数据处理

目录 一、位图1.1 经典题目1.2 位图概念1.3 位图的应用1.4 关于位图的三个经典问题 二、布隆过滤器2.1 布隆过滤器的提出2.2 布隆过滤器的概念2.3 布隆过滤器的插入2.4 布隆过滤器的查找2.5 布隆过滤器删除2.6 代码实现2.7 布隆过滤器的优点2.8 布隆过滤器的缺陷2.9 布隆过滤器…

TongWeb8下应用忙碌线程监控

问题 : 在系统运行过程中发现TongWeb进程占用CPU过高,需要分析是应用哪里引起的问题。 分析过程(仅限Linux环境): 1. 通过top命令查看TongWeb的java进程占用的CPU情况。 查看误区:不要以为java进程CPU占到398%就是高&#xff0…

MySQL学习笔记12

MySQL 查询语句: 1、查询五子句:(重点) mysql> select */字段列表 from 数据表名称 where 子句 group by 子句 having 子句 order by 子句 limit 子句; 1)where 子句;条件筛选。 2)group…

golang 通过案列感受下内存分析

package main // 声音文件所在的包,每个go文件必须有归属的包 import ("fmt" )// 引入程序中需要用的包,为了使用包下的函数,比如:Printinfunc exchangeNum(num1 int, num2 int){var t intt num1num1 num2num2 t }…

Elasticsearch:什么是向量和向量存储数据库,我们为什么关心?

Elasticsearch 从 7.3 版本开始支持向量搜索。从 8.0 开始支持带有 HNSW 的 ANN 向量搜索。目前 Elasticsearch 已经是全球下载量最多的向量数据库。它允许使用密集向量和向量比较来搜索文档。 矢量搜索在人工智能和机器学习领域有许多重要的应用。 有效存储和检索向量的数据库…