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

news2024/11/24 11:53:36

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.ScrollBarAlwaysOff
    Flickable {
        // …
    }
}

它可以通过替换可绑定到任何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: textField1
    property alias button1: button1
 
    RowLayout {					//水平布局
        anchors.horizontalCenter: parent.horizontalCenter
						//在页面上居中
        anchors.topMargin: 20				//距顶部20像素
        anchors.top: parent.top				//顶端对齐
 
        TextField {					//文本框控件
            id: textField1
            placeholderText: qsTr("Text Field")
        }
 
        Button {					//按钮控件
            id: button1
            text: 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: true
    header: 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.width
    TabButton {
        text: "FirstTab"
		// ...
    }
    TabButton {
        text: "SecondTab"
		// ...
    }
    TabButton {
        text: "ThirdTab"
		// ...
    }
}

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

ApplicationWindow {
    visible: true
    width: 240
    height: 480
    title: qsTr("标签栏")
 
    header: TabBar {
        id: bar
        width: parent.width
 
        Repeater {
            model: ["第一页", "第二页", "第三页", "第四页", "第五页"]
 
            TabButton {
                text: modelData
                width: 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: group1
    title: qsTr("性别")
    Layout.fillWidth: true
    RowLayout {				
        ExclusiveGroup { id: sexGroup }	/* 互斥选项组*/
        RadioButton {			/* 单选按钮 */
            text: qsTr("男")
            checked: true
            exclusiveGroup: sexGroup
            Layout.minimumWidth: 65		//设置控件所占最小宽度为65
        }
        RadioButton {
            text: qsTr("女")
            exclusiveGroup: sexGroup
            Layout.minimumWidth: 65
        }
    }
}

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

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

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

Flickable {
    id: flickable
    anchors.fill: parent
 
    TextArea.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.0
 
Item {
    /*
	...
    */
}

(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.coloradmin.cn/o/1038059.html

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

相关文章

ElementUI实现登录注册+axios全局配置+CORS跨域

一、搭建项目 1.1 安装 Element-UI 先确保是否安装了vue-cli脚手架工具 !!! 安装vue脚手架可以看看我的上一篇博客 构建好项目后通过npm安装element-ui cd 项目根路径 #进入新建项目的根目录 npm install element-ui -S #安装…

MySQL简介以及安装和部署(Linux)

MySQL简介 MySQL是一个小型关系数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16号被sun公司10亿美金收购。2009年,SUN又被Oracle以74亿美金收购。 目前MySQL被广泛地应用在Internet上的中小型网站中。由于体积小、速度快、总体拥有成本低&…

C#__简单使用TCP/UDP发送消息

Socket(套接字、插口) TCP和UCP的区别: 1、基于连接和无连接 2、对系统资源的要求(TCP较多,UCP少) 3、UDP程序结构简单 4、流模式和数据报模式 5、TCP保证数据正确性和数据先后顺…

【腾讯云国际站】CDN内容分发网络特性介绍

为什么使用腾讯云国际站 CDN 内容分发网络? 当用户直接访问源站中的静态内容时,可能面临的体验问题: 客户离服务器越远,访问速度越慢。客户数量越多,网络带宽费用越高。跨境用户访问体验较差。 腾讯云国际站CDN 如何改…

yum和vim工具的使用

目录 yum工具的使用 yum下载原理 软件的查找&下载&删除操作 查找lrzsz软件(文件上传或者下载软件) 下载lrzsz软件 删除lrzsz软件 vim工具的使用 vim命令模式 命令模式与光标相关的快捷键: 插入模式 底行模式 在本次的博客当中我们主要…

C#/Unity3D 单例模板(单例属性模板)

C# 单例单例属性 不做过多解释&#xff0c;非面向大众 using System; namespace EasyAVG {public static class SingletonProperty<T> where T : class{private static readonly object locker new object();private volatile static T instance null;public static…

一篇文章成为递归大神:MySQL递归查询(with recursive)

理论原理 1、MySQL with Recursive是什么&#xff1f; MySQL with Recursive是一种基于递归思想的MySQL查询方式&#xff0c;可以实现对数据的递归查询和处理&#xff0c;返回符合条件的数据。在MySQL 8.0版本中&#xff0c;该功能被正式引入。 2、MySQL with Recursive有什么…

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

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

xxe攻击(XML外部实体)

1.定义 XML用于标记电子文件使其具有结构性的标记语言&#xff0c;可以用来标记数据、定义数据类型&#xff0c;是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义&#xff08;可选&#xff09;、文档元素。 http://www.w3school.com.…

Spring学习笔记9 SpringIOC注解式开发

Spring学习笔记8 Bean的循环依赖问题_biubiubiu0706的博客-CSDN博客 注解的存在主要是为了简化XML的配置.Spring6倡导全注解式开发 回顾下 注解怎么定义,注解中的属性怎么定义 注解怎么使用 通过反射机制怎么读取注解 注解的自定义 注解的使用 通过反射机制怎么读取注解 I…

顺序表的实现和练习

杂谈&#xff1a; 有些数据结构&#xff08;C语言实现&#xff09;的教材/教程中会使用C中引用的语法&#xff0c;引用确实在形式上比指针简洁&#xff0c;这样做无非是为了避免后续对二级指针的使用。 我认为既然使用C语言实现数据结构&#xff0c;那么指针就不应该是门槛。…

【动手学深度学习-Pytorch版】序列到序列的学习(包含NLP常用的Mask技巧)

序言 这一节是对于“编码器-解码器”模型的实际应用&#xff0c;编码器和解码器架构可以使用长度可变的序列作为输入&#xff0c;并将其转换为固定形状的隐状态&#xff08;编码器实现&#xff09;。本小节将使用“fra-eng”数据集&#xff08;这也是《动手学习深度学习-Pytor…

[论文分享] How to Better Utilize Code Graphs in Semantic Code Search?

How to Better Utilize Code Graphs in Semantic Code Search? [ESEC/FSE 2022] 语义代码搜索极大地促进了软件的重用&#xff0c;使用户能够找到与用户指定的自然语言查询高度匹配的代码片段。由于代码图(如控制流图和程序依赖图)丰富的表达能力&#xff0c;两种主流的研究工…

【Gradle-9】Gradle插件发布指南

1、前言 不管是在公司内部&#xff0c;还是开源&#xff0c;Gradle插件发布都是一项必备的技能&#xff0c;本文主要介绍本地发布和远端发布两种方式。 2、本地发布 2.1、添加依赖 在plugin>build.gradle文件中&#xff08;插件的项目&#xff09;先依赖一个maven发布的…

分布式搜索引擎Elasticsearch

一、Elasticsearch介绍 1.Elasticsearch产生背景 大数据量的检索NoSql: not only sql,泛指非关系型的数据库Nginx的7层负载均衡和4层负载均衡2.Elasticsearch是什么 一个基于Lucene的分布式搜索和分析引擎,一个开源的高扩展的分布式全文检索引擎 Elasticsearch使用Java开发…

零基础也能制作小说推文视频,输入文案就能制作推文短视频

小说推文视频一直是各类写手们追捧的创作方式之一&#xff0c;而如何制作出优质、吸引人的小说推文视频成了许多人关注的焦点。幸运的是&#xff0c;现在有了一款名为推文视频制作神器&#xff0c;让制作小说推文视频变得轻松简单。 这款小说推文视频神器的功能十分强大&#…

山西电力市场日前价格预测【2023-09-25】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-09-25&#xff09;山西电力市场全天平均日前电价为442.30元/MWh。其中&#xff0c;最高日前电价为720.46元/MWh&#xff0c;预计出现在19: 00。最低日前电价为276.06元/MWh&#xff0c;预计…

AUTOSAR 多核操作系统时序监控系统设计

AUTOSAR 多核操作系统时序监控系统设计 0 引言1 AUTOSAR 介绍1.1 AUTOSAR 诞生1.3 AUTOSAR 架构 2 时序监控系统软硬件介绍2.1 硬件部分2.2 软件部分 3 时序监控系统设计3.1 监控系统整体设计3.2 监控数据获取3.3 监控数据存储3.4 监控数据处理 3.5 还原运行时序5 推动 5G工业互…

3D点云目标检测:Centerformer训练waymo数据集

一、环境准备 项目地址:centerformer 1.0、基础环境 python 3.8.0 torch 1.9.1cu111 waymo-open-dataset-tf-2-6-0 1.4.9 spconv 1.2.1 其余按照requirement.txt里安装就行 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt由于我本人是在…

uniapp、vue实现滑动拼图验证码

uniapp、vue实现滑动拼图验证码 实际开发工作中&#xff0c;在登陆的时候需要短信验证码&#xff0c;但容易引起爬虫行为&#xff0c;需要用到反爬虫验证码&#xff0c;今天介绍一下拼图验证码&#xff0c;解决验证码反爬虫中的滑动验证码反爬虫。滑动拼图验证码是在滑块验证码…