QT6学习第十一天 Qt Quick控件 Control
QT6学习第十一天
- Qt Quick控件
- 控件基类 Control
- 按钮类控件
- 指示器类控件
- 输入类控件
- 日期类控件
Qt Quick控件
Qt Quick本身是为了移动触摸界面而生的,但Qt的跨平台性也决定了它需要支持多种系统。为了支持桌面平台开发,从Qt 5.1开始,增加了新的Qt Quick Controls模块来提供一些现成的控件。其后该模块又提供了对移动和嵌入式平台的支持。
Qt Quick Controls模块是Qt Quick模块的子模块,包含了一组丰富的UI控件,迎合了最常见的用例,并且提供了定制选项,可用于在Qt Quick中构建完整的应用界面。
使用Qt Quick Controls模块,需要导入import QtQuick.Controls
在 pro 文件中需添加 QT += quickcontrols2
控件基类 Control
Control 是用户界面控件的基类型。Qr Quick Controls 模块中的大部分控件都继承自 Control,而 Control 继承自 Item,一般不直接使用该类型,而是使用它的众多子控件类型。Control 从窗口系统接收输入事件并在屏幕上绘制自身,一个典型的 Control 控件布局像这样。
看一个例子
import QtQuick
import QtQuick.ControlsWindow{width:300;height:200visible:trueRectangle{x:100;y:100;width:50;height:40color:"red"Control{width:40;height:30//Insets属性,设置控件背景,不影响控件的视觉外观的情况下扩展其可交互区域,这对于较小的控件非常有用topInset:-2;leftInset:-2;rightInset:-6;bottomInset:-6background:Rectangle{color:"green"}contentItem:Rectangle{color:"yellow"}toPadding:5;leftPadding:2}}
}
上面代码可以理解为,你在 window 里创建了一个 Rectangle,在Rectangle里又布局了几个区域,然后在 Rectangle 里布局这几个区域。
Qt Quick Controls 模块中常用的控件有十类。
按钮类、容器类、委托类、指示器类、输入类、菜单类、导航类、弹出类、分隔类、日期类。
按钮类控件
Qt Quick Controls模块提供了一组按钮类控件,包括AbstractButton及其子孙类型Button、CheckBox、DelayButton、RadioButton、RoundButton、Switch和ToolButton等,每种类型的按钮都有自己的特定用例。
- AbstractButton 为具有类似按钮行为的控件提供界面,它是一个抽象控件,提供了按钮通用的功能,但本身无法直接使用。
- Button 类型实现了一个通用的按钮控件,一般用来执行一个动作或者回答一个问题,比如“确定”“取消”等
- RoundButton 作为Button的子类型,在其基础上添加了一个radius属性,可以创建圆形按钮。
import QtQuick
import QtQuick.Controls
import QtQuick.LayoutsWindow {width: 350; height: 200; visible: true//RowLayout 是一种布局方式RowLayout {anchors.fill: parent; spacing: 10Button { text: qsTr("普通按钮"); onClicked: close() }Button { text: qsTr("flat按钮"); flat: true }Button { text: qsTr("高亮按钮"); highlighted: true }RoundButton { text: qsTr("圆角按钮"); radius: 5 }RoundButton { text: qsTr("圆形按钮"); implicitWidth: 60;implicitHeight: 60; radius: width / 2 }}
}
- CheckBox 复选框用来创建一个选项按钮,可以在“选中”和“未选中”两种状态间切换。复选框通常用于从一组选项中选择一个或多个选项,对于更大的选项集,例如列表中的选项,可以参考使用CheckDelegate。
- RadioButton 单选按钮通常用于从一组选项中选择一个选项。
- ButtonGroup 可以包含一组互斥的按钮,该控件本身是不可见的,一般与RadioButton等控件一起使用。如果需要ButtonGroup中的按钮不再互斥,可以设置exclusive属性为false。使用 ButtonGroup 的最直接方式是为其buttons属性添加按钮列表,例如 buttons: column.children,但是如果 column 的子对象不全是按钮,那么可以使用另一种方式,通过ButtonGroup.group 附加属性单独为每一个按钮指定按钮组。
import QtQuick
import QtQuick.Controls
import QtQuick.LayoutsWindow {width: 350; height: 200; visible: trueColumnLayout {ButtonGroup {id: childGroupexclusive: false; checkState: parentBox.checkState}CheckBox {id: parentBox;text: qsTr("Parent"); checkState: childGroup.checkState}CheckBox {checked: true; text: qsTr("Child 1")leftPadding: indicator.width; ButtonGroup.group: childGroup}CheckBox {text: qsTr("Child 2"); leftPadding: indicator.widthButtonGroup.group: childGroup}}
}
这里有3个 CheckBox,后面两个添加到了一个 ButtonGroup中。对于一个按钮组,只有所有按钮都处于 Qt.Checked 状态,该按钮组才处于“选中”状态,所以这里将第一个CheckBox与ButtonGroup的checkState进行双向绑定,这样只有当后面两个CheckBox同时选中时,第一个CheckBox才会被选中,而如果手动选中第一个CheckBox,那么其他两个CheckBox也会同时被选中。
- DelayButton 是一个可被选中的按钮,在被选中并发出activated()信号之前,有一个延迟,用来防止意外按压。可以通过transition属性来自定义过渡动画。
- Switch 开关按钮可以在“打开”和“关闭”之间进行切换,该按钮通常用于在两种状态之间进行选择,对于更大的选项集,例如列表中的选项,可以改用SwitchDelegate。
import QtQuick
import QtQuick.Controls
import QtQuick.LayoutsWindow {width: 350; height: 200; visible: trueRowLayout {DelayButton {text: qsTr("延迟按钮"); delay: 5000onActivated: text = qsTr("已启动")}Switch {text: qsTr("Wi-Fi")onToggled: console.log(checked)}}
}
指示器类控件
Qt Quick Controls 模块提供的指示器类控件有 BusyIndicator、PageIndicator、ProgressBar、ScrollBar和ScrollIndicator等,它们均直接继承自Control。
- PageIndicator 一般与 StackLayout 这样包含多个页面的容器控件一起使用来指示当前的活动页面;而 ScrollBar 和 ScrollIndicator 一般用于 Flickable 及其子类型,用于显示滚动条和滚动位置。
- BusyIndicator 用来显示一个忙碌指示器控件,可以指示正在加载内容或UI被阻止需等待资源等情况。该类型自身只有一个running属性,在需要等待的情况下将其设置为true即可。
- ProgressBar 用来显示一个进度条指示器控件,可以指示操作的进度。
输入类控件
输入类控件有 ComboBox、Dial、RangeSlider、Slider、TextArea、TextField、Tumbler和SpinBox等。
- ComboBox
ComboBox继承自Control,是一个组合按钮和弹出列表的组合框控件,提供了一种以占用最小屏幕空间的方式向用户呈现选项列表的方法。
import QtQuick
import QtQuick.Controls
import QtQuick.LayoutsWindow {width: 350; height: 200; visible: trueItem {width: 200; height: 300ComboBox {editable: truemodel: ListModel {id: modelListElement { text: "Banana" }ListElement { text: "Apple" }ListElement { text: "Coconut" }}onAccepted: {if (find(editText) === -1)model.append({text: editText})}}}}
- Dial
Dial继承自Control,实现类似于传统的音响上拨号旋钮样式的控件,可以用来指定范围内的值。
Item {width: 100; height: 120Dial {id: dialfrom: 1; to: 10stepSize: 1; wrap: true}Label {anchors.top: dial.bottomtext: dial.value}
}
- RangeSlider、Slider
RangeSlider 继承自Control,用于通过沿轨迹滑动两个控制柄来选择由两个值指定的范围。
RangeSlider {from: 1; to: 100first.value: 25; second.value: 75first.onMoved: console.log(first.value + "," + second.value)second.onMoved: console.log(first.value + "," + second.value)
}
Slider也继承自Control,用于通过沿轨迹滑动控制柄来选择值。该控件与RangeSlider很相似,不过只有一个控制柄。
Slider {from: 1; to: 100; value: 25; stepSize: 10onMoved: console.log(value)
}
- TextArea、TextField
TextArea 继承自 TextEdit,提供了一个多行文本编辑器,在TextEdit 之上添加了占位符文本功能,并进行了一些装饰。
TextField 继承自 TextInput,提供了一个单行文本编辑器,在TextInpu 基础上添加了占位符文本功能,并添加了一些装饰,可以通过background属性来指定背景项目。
Item {width: 200; height: 300ScrollView {id: viewanchors.fill: parentTextArea {background:Rectangle{color:"blue"}placeholderText: qsTr("可以在这里输入内容")wrapMode: Text.WordWrap}}TextField {background: Rectangle {color: "red"}placeholderText: qsTr("Enter name")onAccepted: console.log(text)}}
- Tumbler、SpinBox
Tumbler 继承自Control,用于从可旋转的项目“转轮”中选择一个选项。该控件提供了现成的数据选项,不需要使用键盘输入,而当有大量项目时,它可以首尾相连,这些特性让该控件非常实用。
import QtQuick
import QtQuick.ControlsWindow {visible: truewidth: frame.implicitWidth + 10height: frame.implicitHeight + 10function formatText(count, modelData) {var data = count === 12 ? modelData + 1 : modelData;return data.toString().length < 2 ? "0" + data : data;}Component {id: delegateComponentLabel {text: formatText(Tumbler.tumbler.count, modelData)opacity: 1.0 - Math.abs(Tumbler.displacement)/ (Tumbler.tumbler.visibleItemCount / 2)horizontalAlignment: Text.AlignHCenterverticalAlignment: Text.AlignVCenter}}Frame {id: frameanchors.centerIn: parent; padding: 0Row {id: rowTumbler {id: hoursTumblermodel: 12; delegate: delegateComponent}Tumbler {id: minutesTumblermodel: 60; delegate: delegateComponent}Tumbler {id: amPmTumblermodel: ["AM", "PM"]; delegate: delegateComponent}}}
}
这里创建了3个Tumbler,使用了相同的委托,但是数据模型不同。委托使用的是一个Label,主要设置了文本text和不透明度opacity属性,这里的Tumbler.displacement附加属性的取值范围为−visibleItemCount / 2到visibleItemCount / 2,就是视图可见的项目离视图中间的当前项目的距离,当前项目的该属性值为0。
SpinBox继承自Control,允许用户通过单击向上或向下指示器按钮,或通过键盘向上或向下方向键来选择整数值。尽管SpinBox默认只可以处理整数值,通过validator、textFromValue和valueFromText等属性也可以自定义让其接受任意输入值。
import QtQuick
import QtQuick.ControlsWindow {visible: truewidth: frame.implicitWidth + 10height: frame.implicitHeight + 10SpinBox {id: spinBoxfrom: 0; to: items.length - 1value: 1 // "Medium"property var items: ["Small", "Medium", "Large"]validator: RegularExpressionValidator {regularExpression: new RegExp("(Small|Medium|Large)", "i")}textFromValue: function(value) {return items[value];}valueFromText: function(text) {for (var i = 0; i < items.length; ++i) {if (items[i].toLowerCase().indexOf(text.toLowerCase()) === 0)return i}return spinBox.value}}
}
日期类控件
日期类控件包括 DayOfWeekRow、WeekNumberColumn和MonthGrid,它们都继承自Control。
import QtQuick
import QtQuick.Controls
import QtQuick.LayoutsItem {width: 400; height: 300GridLayout {columns: 2DayOfWeekRow {locale: grid.localeLayout.column: 1Layout.fillWidth: true}WeekNumberColumn {month: grid.month; year: grid.yearlocale: grid.localeLayout.fillHeight: true}MonthGrid {id: gridmonth: Calendar.December; year: 2022locale: Qt.locale("zh_CN")Layout.fillWidth: trueLayout.fillHeight: trueonClicked: (date) => console.log(date)}}
}
相关文章:

QT6学习第十一天 Qt Quick控件 Control
QT6学习第十一天 Qt Quick控件控件基类 Control按钮类控件指示器类控件输入类控件日期类控件 Qt Quick控件 Qt Quick本身是为了移动触摸界面而生的,但Qt的跨平台性也决定了它需要支持多种系统。为了支持桌面平台开发,从Qt 5.1开始,增加了新的…...
【唐叔学算法】第16天:枚举-探索所有可能性的艺术
大家好,我是唐叔。今天我们要探讨的是一个看似简单却非常实用的概念——枚举(Enumeration)。它不仅仅是一种数据类型,在算法设计中也是一种解决问题的策略。通过系统地遍历所有可能的情况,我们可以找到满足特定条件的答…...

【OpenCV】基于GrabCut算法的交互式前景提取
介绍 GrabCut 算法是一种用于图像分割的交互式前景提取技术,它结合了图割(Graph Cut)方法和迭代优化过程。该算法最初由 Rother, Kolmogorov 和 Blake 在 2004 年提出,并因其高效性和准确性而被广泛应用于计算机视觉领域。OpenCV…...

【Flask+OpenAI】利用Flask+OpenAI Key实现GPT4-智能AI对话接口demo - 从0到1手把手全教程(附源码)
文章目录 前言环境准备安装必要的库 生成OpenAI API代码实现详解导入必要的模块创建Flask应用实例配置OpenAI API完整代码如下(demo源码)代码解析 利用Postman调用接口 了解更多AI内容结尾 前言 Flask作为一个轻量级的Python Web框架,凭借其…...

最短路----Dijkstra算法详解
简介 迪杰斯特拉(Dijkstra)算法是一种用于在加权图中找到单个源点到所有其他顶点的最短路径的算法。它是由荷兰计算机科学家艾兹格迪科斯彻(Edsger Dijkstra)在1956年提出的。Dijkstra算法适用于处理带有非负权重的图。迪杰斯特拉…...

ORB-SLAM3源码学习:G2oTypes.cc: void EdgeInertial::computeError 计算预积分残差
前言 这部分函数涉及了g2o的内容以及IMU相关的推导内容,需要你先去进行这部分的学习。 1.函数声明 void EdgeInertial::computeError() 2.函数定义 涉及到的IMU的公式: {// TODO Maybe Reintegrate inertial measurments when difference between …...
Unity协程机制详解
Unity的协程(Coroutine)是一种异步编程的机制,允许在多个帧之间分割代码的执行,而不阻塞主线程。与传统的多线程不同,Unity的协程在主线程中运行,并不会开启新的线程。 什么是协程? 协程是一种…...
2024年【高压电工】最新解析及高压电工考试总结
高压电工考试是电力行业从业人员必须通过的资格考试之一,它不仅检验了考生对高压电技术的掌握程度,还考验了考生在实际操作中的安全意识和应急处理能力。为了帮助广大考生更好地备考,本文整理了10道2024年高压电工考试的最新解析及总结试题&a…...
OELOVE 6.0城市列表模板
研究了好久OELOVE6.0源码,一直想将城市列表给单独整出来,做地区排名,但是PHP程序都是加密的,非常难搞,做二开都是要命的处理不了,在这里有一个简单方法可以处理城市列表,并且可以自定义TDK&…...

如何将你的 Ruby 应用程序从 OpenSearch 迁移到 Elasticsearch
作者:来自 Elastic Fernando Briano 将 Ruby 代码库从 OpenSearch 客户端迁移到 Elasticsearch 客户端的指南。 OpenSearch Ruby 客户端是从 7.x 版 Elasticsearch Ruby 客户端分叉而来的,因此代码库相对相似。这意味着当将 Ruby 代码库从 OpenSearch 迁…...

day1数据结构,关键字,内存空间存储与动态分区,释放
小练习 在堆区空间连续申请5个int类型大小空间,用来存放从终端输入的5个学生成绩,然后显示5个学生成绩,再将学生成绩升序排序,排序后,再次显示学生成绩。显示和排序分别用函数完成(两种排序方法࿰…...

1_linux系统网络性能如何优化——几种开源网络协议栈比较
之前合集《计算机网络从入门到放弃》第一阶段算是已经完成了。都是理论,没有实操,让“程序猿”很难受,操作性不如 Modbus发送的报文何时等到应答和 tcp通信测试报告单1——connect和send。开始是想看linux内核网络协议栈的源码,然…...

【问题记录】07 MAC电脑,使用FileZilla(SFTP)连接堡垒机不成功
项目场景: 使用MAC电脑,以子账号(非root)的形式登录,连接堡垒机CLB(传统型负载均衡),使用FileZilla(SFTP)进行FTP文件传输。 问题描述: MAC电脑…...

前端报错npm ERR cb() never called问题
环境使用node版本v14.21.3,npm版本6.14.18 1.问题描述 1.1使用npm install后报错 npm ERR! cb() never called!npm ERR! This is an error with npm itself. Please report this error at: npm ERR! ? ? <https://npm.community>npm ERR! A complete log…...

康谋方案 | 多源相机数据采集与算法集成测试方案
目录 一、相机组成 二、多源相机采集与测试方案 三、应用案例分享 四、结语 在智能化技术快速发展当下,图像数据的采集与处理逐渐成为自动驾驶、工业等领域的一项关键技术。高质量的图像数据采集与算法集成测试都是确保系统性能和可靠性的关键。随着技术的不断进…...

Graspness 端到端抓取点估计 | 环境搭建 | 模型推理测试
在复杂场景中实现抓取检测,Graspness是一种端到端的方法; 输入点云数据,输出抓取角度、抓取深度、夹具宽度等信息。 开源地址:https://github.com/rhett-chen/graspness_implementation?tabreadme-ov-file 论文地址࿱…...
交换机是如何避免数据碰撞的(详细解释 + 示例)
交换机是如何避免数据碰撞的(详细解释 示例) 1. 独立冲突域 交换机的每个端口都形成一个独立的冲突域。这意味着通过交换机连接的每个设备都拥有自己的通信通道,互不干扰。 示例: 假设一个交换机有4个端口,分别连接…...
魅族手机刷官方系统
从魅族官网下载固件 https://flyme.cn/firmware.html 找到自己的型号,里面有历史版本、最新版,按照需求下载。 下载的是update.zip,改名就不能升级了 方法1 直接点击下载的update.zip包就可以升级。 方法2 将文件移动到文件管理的根目录&a…...
女人想要的,是那份懂她的情绪价值
女人想要的,是那份懂她的情绪价值 在情感的世界里,我们常常听到这样的声音:“我不需要你帮我解决问题,我只希望你能懂我。”这句话,简单却深刻,它揭示了女性在情感需求上的一个独特面向——她们渴望的&…...
[python SQLAlchemy数据库操作入门]-10.性能优化:提升 SQLAlchemy 在股票数据处理中的速度
哈喽,大家好,我是木头左! 当处理大量数据时,如股票数据,默认的ORM操作可能会显得效率低下。本文将探讨如何通过一些技巧和策略来优化SQLAlchemy ORM的性能,从而提升其在股票数据处理中的速度。 1. 选择合适的数据类型 在定义模型时,选择合适的数据类型对于性能至关重要…...
1. Web网络基础 - IP地址核心知识解析
深入解析IP地址与ipconfig命令:网络工程师的必备技能 在网络世界中,IP地址是设备通信的基石。本文将全面解析IP地址的核心概念,并通过ipconfig命令实战演示如何获取关键网络配置信息。 一、IP地址核心知识解析 1. IP地址的本质 定义&#x…...

老年生活照护实训室建设规划:照护质量评估与持续改进实训体系
随着人口老龄化程度的不断加深,老年生活照护需求日益增长,对专业照护人才的培养提出了更高要求。老年生活照护实训室建设方案作为培养高素质照护人才的重要载体,其核心在于构建科学完善的照护质量评估与持续改进实训体系。通过该体系的建设&a…...
高防IP可以防护什么攻击类型?企业网络安全的第一道防线
“高防IP”成为企业构建网络安全防护体系的重要一环。尤其是对于金融、电商、游戏、政务等业务高度依赖网络稳定性的行业而言,确保系统724小时正常运行已经成为基本要求。高防IP到底可以防护哪些攻击类型?它又是如何帮助企业抵御风险、保障服务稳定运行的…...
Vulkan 3D Tiles渲染器开发笔记1-脚手架搭建
一、项目简介 项目技术栈 CesiumNative + Dear ImGui + Vulkan 1.3 三维地理可视化系统 详细项目功能说明 1. 3DTiles渲染功能 实现完整的3DTiles格式解析与加载引擎支持LOD(Level of Detail)分层细节渲染可加载建筑模型、点云等3DTiles资产示例:加载城市级建筑3DTiles数据…...

【原创】基于视觉模型+FFmpeg+MoviePy实现短视频自动化二次编辑+多赛道
AI视频处理系统功能总览 🎯 系统概述 这是一个智能短视频自动化处理系统,专门用于视频搬运和二次创作。系统支持多赛道配置,可以根据不同的内容类型(如"外国人少系列"等)应用不同的处理策略。 Ἵ…...

51单片机基础部分——矩阵按键检测
前言 上一节,我们说到了独立按键的检测以及使用,但是独立按键每一个按键都要对应一个IO口进行检测,在一些需要多按键的情况下,使用过多的独立按键会过多的占用单片机的IO资源,为了解决这个问题的出现,我们…...
Java 中 ArrayList、Vector、LinkedList 的核心区别与应用场景
Java 中 ArrayList、Vector、LinkedList 的核心区别与应用场景 引言 在 Java 集合框架体系中,ArrayList、Vector和LinkedList作为List接口的三大经典实现类,共同承载着列表数据的存储与操作功能。然而,由于底层数据结构设计、线程安全机制以…...
# 主流大语言模型安全性测试(二):英文越狱提示词下的表现与分析
主流大语言模型安全性测试(二):英文越狱提示词下的表现与分析 在上一篇文章中,我们对多个主流大语言模型(LLM)进行了中文诱导性提示词的越狱测试,评估其是否能够在面对非法、有害或危险内容请求…...
使用Conda管理服务器多版本Python环境的完整指南
在服务器环境中管理多个Python版本是开发者和系统管理员常见的需求,尤其是当不同项目依赖特定版本的Python时。本文将重点介绍如何通过Conda实现多版本Python的隔离与管理,确保服务器环境的稳定性和灵活性。 为什么需要多版本Python管理? 服…...
Android Test3 获取的ANDROID_ID值不同
Android Test3 获取的ANDROID_ID值不同 这篇文章来说明上一篇文章中说到的一个现象:在同一个项目中,创建不同的 app module,运行同一段测试代码,获取到的 ANDROID_ID 的值不同。 我也是第一次认真研究这个现象,这个还…...