开源 C++ QT QML 开发(八)自定义控件--圆环 - 实践

news/2025/11/6 11:21:23/文章来源:https://www.cnblogs.com/gccbuaa/p/19195935

           文章的目的为了记录使用QT QML开发学习的经历。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。

  相关链接:

开源 C++ QT QML 开发(一)基本介绍

开源 C++ QT QML 开发(二)工程结构

开源 C++ QT QML 开发(三)常用控件

开源 C++ QT QML 开发(四)复杂控件--Listview

开源 C++ QT QML 开发(五)复杂控件--Gridview

开源 C++ QT QML 开发(六)自定义控件--波形图

开源 C++ QT QML 开发(七)自定义控件--仪表盘

开源 C++ QT QML 开发(八)自定义控件--圆环

开源 C++ QT QML 开发(九)文件--文本和二进制

推荐链接:

开源 C# 快速开发(一)基础知识

开源 C# 快速开发(二)基础控件

开源 C# 快速开发(三)复杂控件

开源 C# 快速开发(四)自定义控件--波形图

开源 C# 快速开发(五)自定义控件--仪表盘

开源 C# 快速开发(六)自定义控件--圆环

开源 C# 快速开发(七)通讯--串口

开源 C# 快速开发(八)通讯--Tcp服务器端

开源 C# 快速开发(九)通讯--Tcp客户端

开源 C# 快速开发(十)通讯--http客户端

开源 C# 快速开发(十一)线程

开源 C# 快速开发(十二)进程监控

开源 C# 快速开发(十三)进程--管道通讯

开源 C# 快速开发(十四)进程--内存映射

开源 C# 快速开发(十五)进程--windows消息

开源 C# 快速开发(十六)数据库--sqlserver增删改查

本章节主要内容是:圆环进度控件,参数可设置,数据可实时更新。

1.代码分析

2.所有源码

3.效果演示

一、代码分析1. 主程序文件 (main.qml) 分析
ApplicationWindow 主窗口

ApplicationWindow {
    id: mainWindow
    width: 400
    height: 400
    title: "圆环进度控件示例"
    visible: true
    property real currentValue: 0      // 定义当前数值属性,初始为0
    property real maxValue: 100        // 定义最大值属性,初始为100


功能: 创建应用程序主窗口,定义了两个关键属性用于数据绑定。

columnlayout

ColumnLayout {
    anchors.centerIn: parent  // 布局居中于父元素
    spacing: 20              // 子元素间距20像素


函数作用: 创建垂直布局,自动管理子元素的位置和大小

戒指
文本

RingProgress {
    id: ringProgress
    Layout.preferredWidth: 200    // 设置首选宽度
    Layout.preferredHeight: 200   // 设置首选高度
    currentValue: mainWindow.currentValue    // 绑定到主窗口的当前值
    maxValue: mainWindow.maxValue            // 绑定到主窗口的最大值
    backgroundColor: "#f0f0f0"               // 设置背景色
    ringBackgroundColor: "#e0e0e0"           // 设置圆环底色
    ringColor: "#4CAF50"                     // 设置进度圆环颜色
    ringWidth: 15                            // 设置圆环宽度
}


属性绑定机制: 这里使用了QML的数据绑定,当`mainWindow.currentValue改变时,会自动更新圆环控件。

按钮控制区域

Button {
    text: "加10"
    onClicked: {  // 点击事件处理函数
        if (mainWindow.currentValue + 10 <= mainWindow.maxValue) {
            mainWindow.currentValue += 10    // 增加值,不超过最大值
        } else {
            mainWindow.currentValue = mainWindow.maxValue  // 达到最大值
        }
    }
}


函数逻辑:

onClicked: 按钮点击信号的处理函数

条件判断确保数值在有效范围内

直接修改绑定的属性值,触发界面更新

2. 自定义圆环控件 (RingProgress.qml) 详细分析
属性定义部分

property real currentValue: 0        // 当前进度值
property real maxValue: 100          // 最大值
property color backgroundColor: "#f0f0f0"      // 控件背景色
property color ringBackgroundColor: "#e0e0e0"  // 圆环背景色
property color ringColor: "#4CAF50"            // 进度圆环颜色
property real ringWidth: 15                    // 圆环线条宽度


这些属性提供了控件的可配置接口。

计算属性

property real progress: currentValue / maxValue  // 计算进度比例(0-1)
property real startAngle: -90      // 起始角度(从顶部开始)
property real endAngle: startAngle + (progress * 360)  // 结束角度


计算原理:

progress: 通过数据绑定自动计算当前进度百分比
endAngle: 根据进度比例计算对应的圆弧结束角度

背景矩形

Rectangle {
    id: backgroundRect
    anchors.fill: parent        // 填充整个父元素
    radius: width / 2          // 圆角半径设为宽度一半,形成圆形
    color: ringProgress.backgroundColor  // 使用配置的背景色
}


函数作用: 创建圆形背景,anchors.fill确保大小自适应。

圆环底色Canvas

Canvas {
    id: backgroundCanvas
    anchors.fill: parent
    antialiasing: true    // 开启抗锯齿
    onPaint: {  // 绘制函数,在需要重绘时自动调用
        var ctx = getContext("2d")  // 获取2D绘图上下文
        ctx.reset()                 // 重置画布状态
        var centerX = width / 2     // 计算中心点X坐标
        var centerY = height / 2    // 计算中心点Y坐标
        var radius = Math.min(centerX, centerY) - ringWidth / 2  // 计算圆环半径
        ctx.beginPath()                         // 开始绘制路径
        ctx.lineWidth = ringWidth              // 设置线条宽度
        ctx.lineCap = "round"                  // 设置线条端点样式为圆形
        ctx.strokeStyle = ringBackgroundColor  // 设置线条颜色
        ctx.arc(centerX, centerY, radius, 0, Math.PI * 2)  // 绘制完整圆形
        ctx.stroke()                           // 描边绘制
    }
}


绘制函数详细分析:

getContext("2d"): 获取HTML5 Canvas风格的2D绘图上下文

ctx.arc(x, y, radius, startAngle, endAngle): 绘制圆弧

参数: 中心坐标(x,y), 半径, 起始角度, 结束角度(弧度制)

Math.PI * 2表示360度,绘制完整圆环

进度圆环Canvas

Canvas {
    id: progressCanvas
    // ... 类似的属性设置
    OnPaint : {
        var ctx =  getContext (“ 2d” )
        ctx 。重置()
        var Centerx =宽度/  2
        var Centery =高度/  2
        var radius =数学。Min ( Centerx , Centery ) -环宽/  2
        // 角度转换:QML使用度,Canvas使用弧度
        var startAngleRad = (startAngle - 90) * Math.PI / 180
        var endAngleRad = (endAngle - 90) * Math.PI / 180
        CTX 。BeginPath ()
        CTX 。线宽=环宽
        CTX 。 linecap =  “圆形”
        CTX 。 strokestyle = ringcolor
        ctx.arc(centerX, centerY, radius, startAngleRad, endAngleRad)  // 绘制进度圆弧
        ctx.stroke()
    }
}


关键算法:

角度转换: (角度 - 90) * π / 180

减90度是因为默认

乘以π/180将角度转换为弧度

只绘制从startAngleRad到的圆弧,显示进度endAngleRad

中心文本

Text {
    id: centerText
    anchors.centerIn: parent  // 在父元素中居中
    text: Math.round((currentValue / maxValue) * 100) + "%"  // 计算百分比文本
    font.pixelSize: Math.min(parent.width, parent.height) * 0.25  // 自适应字体大小
    font.bold: true
    color: "#333333"
}


文本计算:

使用Math.round()四舍五入百分比值

字体大小根据控件尺寸自适应属性变化响应

onCurrentValueChanged: {
    progressCanvas.requestPaint()  // 请求重绘进度圆环
}
onMaxValueChanged: {
    backgroundCanvas.requestPaint()  // 重绘底色圆环
    progressCanvas.requestPaint()    // 重绘进度圆环
}


数据绑定机制:

当属性值改变时,自动调用对应的信号处理函数

requestPaint()通知Canvas需要重新绘制

初始化函数组件。 ​

作用: 组件完成创建后立即执行初始绘制。

3. 核心算法总结
圆环绘制算法
半径计算: Math.min(centerX, centerY) - ringWidth / 2

取宽高的最小值确保圆形

减去圆环宽度的一半避免超出边界

角度计算:

起始角度: -

结束角度: -90 + (progress * 360)度

弧度转换: 角度 * π / 180

进度显示:

当progress=0.5(50%)时,绘制从-90度到90度的圆弧,正好是180度

二、所有源码

ringProgress.qml文件源码

import QtQuick 2.12
Item {id: ringProgress// 可配置属性property real currentValue: 0property real maxValue: 100property color backgroundColor: "#f0f0f0"property color ringBackgroundColor: "#e0e0e0"property color ringColor: "#4CAF50"property real ringWidth: 15// 计算属性property real progress: currentValue / maxValueproperty real startAngle: -90  // 从顶部开始property real endAngle: startAngle + (progress * 360)width: 200height: 200// 背景Rectangle {id: backgroundRectanchors.fill: parentradius: width / 2color: ringProgress.backgroundColor}// 圆环底色(完整的圆环)Canvas {id: backgroundCanvasanchors.fill: parentantialiasing: trueonPaint: {var ctx = getContext("2d")ctx.reset()var centerX = width / 2var centerY = height / 2var radius = Math.min(centerX, centerY) - ringWidth / 2ctx.beginPath()ctx.lineWidth = ringWidthctx.lineCap = "round"ctx.strokeStyle = ringBackgroundColorctx.arc(centerX, centerY, radius, 0, Math.PI * 2)ctx.stroke()}}// 进度圆环Canvas {id: progressCanvasanchors.fill: parentantialiasing: trueonPaint: {var ctx = getContext("2d")ctx.reset()var centerX = width / 2var centerY = height / 2var radius = Math.min(centerX, centerY) - ringWidth / 2// 转换为弧度var startAngleRad = (startAngle - 90) * Math.PI / 180var endAngleRad = (endAngle - 90) * Math.PI / 180ctx.beginPath()ctx.lineWidth = ringWidthctx.lineCap = "round"ctx.strokeStyle = ringColorctx.arc(centerX, centerY, radius, startAngleRad, endAngleRad)ctx.stroke()}}// 中心文本Text {id: centerTextanchors.centerIn: parenttext: Math.round((currentValue / maxValue) * 100) + "%"font.pixelSize: Math.min(parent.width, parent.height) * 0.25font.bold: truecolor: "#333333"}// 当属性改变时重绘CanvasonCurrentValueChanged: {progressCanvas.requestPaint()}onMaxValueChanged: {backgroundCanvas.requestPaint()progressCanvas.requestPaint()}onRingWidthChanged: {backgroundCanvas.requestPaint()progressCanvas.requestPaint()}onRingBackgroundColorChanged: {backgroundCanvas.requestPaint()}onRingColorChanged: {progressCanvas.requestPaint()}Component.onCompleted: {backgroundCanvas.requestPaint()progressCanvas.requestPaint()}
}

main.qml文件源码

import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
ApplicationWindow {id: mainWindowwidth: 400height: 400title: "圆环进度控件示例"visible: trueproperty real currentValue: 0property real maxValue: 100ColumnLayout {anchors.centerIn: parentspacing: 20// 圆环进度控件RingProgress {id: ringProgressLayout.preferredWidth: 200Layout.preferredHeight: 200currentValue: mainWindow.currentValuemaxValue: mainWindow.maxValuebackgroundColor: "#f0f0f0"ringBackgroundColor: "#E6F7FF"    // 非常浅的天蓝色ringColor: "#00BFFF"              // 深天蓝色ringWidth: 15}// 按钮控制区域RowLayout {Layout.alignment: Qt.AlignHCenterspacing: 10Button {text: "加10"onClicked: {if (mainWindow.currentValue + 10 <= mainWindow.maxValue) {mainWindow.currentValue += 10} else {mainWindow.currentValue = mainWindow.maxValue}}}Button {text: "减10"onClicked: {if (mainWindow.currentValue - 10 >= 0) {mainWindow.currentValue -= 10} else {mainWindow.currentValue = 0}}}}// 显示当前数值Text {Layout.alignment: Qt.AlignHCentertext: "当前值: " + mainWindow.currentValuefont.pixelSize: 16}}
}

三、效果演示

运行后点击按钮,实时更新圆环值,打印当前圆环值。

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

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

相关文章

psql -U PostgreSQL端命令

psql -U PostgreSQL端命令PostgreSQL端命令 🧭 基本连接与退出命令 说明psql -U 用户名 -d 数据库名 连接到数据库\q 退出 psql\c 数据库名 切换数据库(需重新连接)📋 数据库管理命令 说明\l 或 \list 查看所有数…

Linux V4L2框架详解:Camera软件架构与驱动达成

Linux V4L2框架详解:Camera软件架构与驱动达成pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

2025年铝门窗招商加盟机构权威推荐榜单:门窗加盟店/铝合金门窗品牌加盟/断桥门窗加盟源头机构精选

在当前建筑节能与家居智能化融合发展的背景下,铝门窗行业正迎来新一轮产业升级。根据行业数据,2025年中国铝合金门窗市场规模预计达到千亿级别,并有望在2030年突破两千亿元。随着绿色建筑理念普及和消费升级,具备智…

2025年11月学无人机学校评价榜:正规资质与课程深度盘点

想把无人机从爱好变成职业,却常被“哪家学校正规”“考完执照能否申请空域”“培训费会不会打水漂”这些问题困住。2025年,民用无人驾驶航空器操控员执照考试人数已突破18万,比2023年增长42%,行业缺口的背后却是培…

2025年11月产品设计公司推荐榜:从资质到案例全维度评测

把新产品从概念变成可量产的商品,中间需要跨越外观设计、结构验证、供应链衔接、品牌包装等十余道关卡。对初创团队来说,缺人手;对制造型企业来说,缺灵感;对品牌方来说,缺时间。三方共同痛点是:如何在有限预算内…

线程组 HTTP请求 结果树 聚合报告

1.线程组:右击测试计划——添加——线程(用户)——线程组 2.HTTP请求:右击线程组——添加——取样器——HTTP请求 3.结果树:右击HTTP请求——添加——监听器——查看结果树 保存 运行 4.聚合报告:右击HTTP请求—…

2025年11月产品设计公司推荐榜:权威评测五强排名与对比

正在找一家能把创意变成可量产商品、又能兼顾品牌长期价值的产品设计公司?多数企业主在2025年都面临相似困境:新品迭代周期被压缩到6个月以内,供应链波动让样机到量产的风险陡增,同时国内消费者对颜值、体验、可持…

2025年11月工业设计公司评测榜:五强数据对比与选择参考

2025年11月,当企业准备把技术原型转化为可量产商品、当创业团队需要把概念故事变成握得住的样机、当品牌方计划用全新视觉抢占年轻市场,他们最先搜索的关键词往往是“工业设计公司”。用户画像高度集中:硬件初创公司…

leetcode热题100-001:两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任…

2025年环保线带行业满意度TOP5榜单:创织美满意度怎么样?

在绿色包装与品牌增值需求日益凸显的当下,环保线带作为连接产品与消费者的隐形纽带,其品质稳定性、定制灵活性与环保合规性直接影响终端包装体验。面对市场上参差不齐的供应商,如何选择兼具口碑与实力的合作伙伴?以…

简单接口并发测试

1. 新建线程组,设置线程数5、循环次数2、 ramp-up时间3秒(每秒启动约2个线程)。2. 添加HTTP请求(GET方法,服务器httpbin.org,路径/delay/1,模拟1秒响应接口)。3. 添加“聚合报告”监听器,运行后查看平均响应时…

2025 年白炭黑生产厂家最新推荐排行榜:涵盖微珠 / 疏水 / 气相法 / 沉淀法等多类型产品,权威测评选出优质企业供下游参考二氧化硅/胶粉用白炭黑公司推荐

引言 白炭黑作为橡胶、油漆、涂料等行业的关键原料,其品质与供应稳定性直接影响下游生产。为帮助企业精准选择合作伙伴,行业协会联合专业测评机构开展了 2025 年度白炭黑生产厂家测评工作。本次测评采用 “三维指标体…

高光谱影像坏点异常值的个人处理方法

在做遥感数据处理前一定看看数据的大致情况,用快速统计工具看看有没有坏点或者哪个波段数据异常,比如某个波段数据丢失,或者异常离群值!!! 等你处理了一周的数据到最后发现出问题后就知道有多重要了。 QAQ如上图…

3. 简单接口并发测试

操作步骤:新建线程组,设置线程数5、循环次数2、 ramp-up时间3秒(每秒启动约2个线程)。添加HTTP请求(GET方法,服务器httpbin.org,路径/delay/1,模拟1秒响应接口)。添加“聚合报告”监听器,运行后查看平均响应…

接口并发测试

1. 新建线程组,设置线程数5、循环次数2、 ramp-up时间3秒(每秒启动约2个线程)。2. 添加HTTP请求(GET方法,服务器httpbin.org,路径/delay/1,模拟1秒响应接口)。3. 添加“聚合报告”监听器,运行后查看平均响应时…

2025年11月中国GEO服务商排行榜及深度解读

摘要 2025年,中国GEO(AI搜索优化)行业迎来爆发式增长,驱动企业营销智能化转型。本文基于权威数据,解析2025年11月中国GEO服务商排行榜TOP5,重点推荐摘星AI作为行业领军者,并提供详细表单供参考。榜单结合推荐指…

2025年度中国GEO营销口碑排行前五

摘要 2025年,中国GEO(AI搜索优化)行业迎来爆发式增长,随着AI技术的深度融合,企业营销方式正经历革命性变革。本文基于行业数据和用户反馈,精选出2025年度中国GEO营销口碑排行前五的服务商,为企业在选择GEO解决方…

2025年11月中国GEO平台推荐排行榜:AI搜索优化技术全面解析

摘要 2025年是中国GEO(AI搜索优化)行业发展的关键一年,随着人工智能技术的深度应用,GEO平台正成为企业营销转型的核心驱动力。本文基于权威数据分析和行业实践,为您呈现2025年11月中国GEO平台综合推荐排行榜,为企…

C#开发OPC UA客户端

使用C#开发OPC UA客户端能帮助你在工业自动化和物联网项目中与各种设备进行可靠的数据交换。提供两种主流的开发方式:使用官方OPC UA .NET Standard SDK和使用第三方库OpcUaHelper。这两种方式各有特点,适合不同的开…

当下中国GEO平台推荐榜单深度解析

摘要 GEO(AI搜索优化)行业在2025年迎来爆发式增长,AI驱动营销成为企业核心竞争力。本文基于行业权威数据和用户反馈,深度解析2025年11月中国GEO平台推荐榜单Top 5,重点介绍领先服务商的技术优势与服务成果,为企业…