Qt QML 基于画布的扇形的进度条(Canvas)

Qt QML 基于画布的扇形的进度条


所有的热爱都要不遗余力,真正喜欢它便给它更高的优先级,和更多的时间吧!

GIT工程文件在这里:     QmlLearningPro编译选择 CanvasSector

QML其它文章请点击这里:     QT QUICK QML 学习笔记


1. 演示

效果如下:
在这里插入图片描述

2. 实现过程

1. 先看下静态的扇形如何显示:

画板提供了arc() 函数来实现扇形区域:

object arc(real x, real y, real radius, real startAngle, real endAngle, bool anticlockwise)

以圆点(x, y)、半径 radius 的圆周上画弧, startAngle 和 endAngle都是从x轴开始以弧度测量的。以下为官方帮助文档的截图:
在这里插入图片描述
所以,我们先画一个最简单的扇形

Canvas{ ///画布
    id: _canvas
    width: 200
    height: 200
    anchors.margins: 50
    anchors.centerIn: parent
    contextType:  "2d";
    onPaint: {
        var ctx = getContext("2d");  ///画师
        ctx.fillStyle = "red"
        ctx.save();                 //ctx.save() 和 ctx.restore(); 搭配使用是清除画板的
        ctx.beginPath();
        //移动画笔到100,100位置
        ctx.moveTo(100,100);
        //原点在100,100,半径为100 ——> 起始度数为180  结束度数270
        ctx.arc(100, 100, 100, 180*Math.PI/180, 270 * Math.PI/180);
        ctx.closePath();
        ctx.fill()
        ctx.restore();
    }

运行如下:
在这里插入图片描述

2. 实现了一个扇形后,再实现多个扇形:

function paintPer(ctx,x,y, r, startAngle,endAngle, color) {
    ctx.fillStyle = color
    ctx.save();         //ctx.save() 和 ctx.restore(); 搭配使用是清除画板的
    ctx.beginPath();
    ctx.moveTo(x,y);
    ctx.arc(x,y,r,startAngle*Math.PI/180, endAngle*Math.PI/180);
    ctx.closePath();
    ctx.fill()
    ctx.restore();
}

onPaint: {
    var ctx = getContext("2d");  ///画师
    //外层底图
    paintPer(ctx,100,100,100,180,360,'grey')
    //外层动图:  angle就是显示的目标角度
    paintPer(ctx,100,100,100,180,angle,'black')
    //中间空白层
    paintPer(ctx,100,100,75,0,360,"white")
    //内层底图
    paintPer(ctx,100,100,66,180,360,'#EEE8CD')
    //内层动图 angle就是显示的目标角度
    paintPer(ctx,100,100,66,180,angle,'#EEB422')
    //内层空白层
    paintPer(ctx,100,100,63,0,360,"white")
}

如下:
在这里插入图片描述

3. 数据源:

//currentValue:   0%~100%
property real currentValue : 0
//angle:         180°~360°   //180°为100份
property real angle: (currentValue * 180 / 100 + 180)

Timer{
    id: timer
    interval: 20;
    running: true;
    repeat:     true;
    onTriggered: {
        if(currentValue === 100) {
            currentValue = 0;
        }
        currentValue += 1;
    }
}

完整代码

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 1.4

Window {
    id: root
    visible: true
    width: 400
    height: 200
    title: qsTr("Canvas For Sector")

    //currentValue:   0%~100%
    property real currentValue : 0
    //angle:         180°~360°   //180°为100份
    property real angle: (currentValue * 180 / 100 + 180)

    onCurrentValueChanged: _canvas.requestPaint();

    Canvas{ ///画布
        id: _canvas

        width: 200
        height: 200
        anchors.margins: 50
        anchors.centerIn: parent

        Timer{
            id: timer
            interval: 20;
            running: true;
            repeat:     true;
            onTriggered: {
                if(currentValue === 100) {
                    currentValue = 0;
                }
                currentValue += 1;
            }
        }

        contextType:  "2d";

        function paintPer(ctx,x,y, r, startAngle,endAngle, color) {

            ctx.fillStyle = color
            ctx.save();         //ctx.save() 和 ctx.restore(); 搭配使用是清除画板的
            ctx.beginPath();
            ctx.moveTo(x,y);
            ctx.arc(x,y,r,startAngle*Math.PI/180, endAngle*Math.PI/180);
            ctx.closePath();
            ctx.fill()
            ctx.restore();
        }

        onPaint: {
            var ctx = getContext("2d");  ///画师
            //外层底图
            paintPer(ctx,100,100,100,180,360,'grey')
            //外层动图:  angle就是显示的目标角度
            paintPer(ctx,100,100,100,180,angle,'black')
            //中间空白层
            paintPer(ctx,100,100,75,0,360,"white")
            //内层底图
            paintPer(ctx,100,100,66,180,360,'#EEE8CD')
            //内层动图 angle就是显示的目标角度
            paintPer(ctx,100,100,66,180,angle,'#EEB422')
            //内层空白层
            paintPer(ctx,100,100,63,0,360,"white")
        }

        //可以文字,可以图片
        Text {
            id: txt_progress
            anchors.bottom: parent.bottom
            anchors.bottomMargin: 100
            anchors.horizontalCenter: parent.horizontalCenter

            font.pixelSize: 26  //16
            font.bold:      true

            text: currentValue.toString() + "%"
            color: 'black'
        }
    }
}

GIT 工程文件点击这里:     QmlLearningPro编译选择 CanvasSector

QML 其它文章请点击这里:     QT QUICK QML 学习笔记

  • 16
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Qt QML 中的进度条可以通过 QML 的 ProgressBar 组件来实现。进度条用于显示任务的进度,通常用于长时间运行的任务中,让用户了解任务的完成情况。 在 QML 中使用进度条,首先需要导入 QtQuick 控件库: ``` import QtQuick.Controls 2.12 ``` 然后可以在界面中加入一个 ProgressBar 组件: ``` ProgressBar { minimumValue: 0 // 进度条的最小值 maximumValue: 100 // 进度条的最大值 value: 50 // 当前的进度值 } ``` 在上面的例子中,我们设置了进度条的最小值为 0,最大值为 100,当前进度值为 50。 进度条还可以通过设置不同的属性来自定义样式,例如可以设置颜色、高度、方向等: ``` ProgressBar { width: 200 height: 20 progressColor: "blue" orientation: ProgressBar.Horizontal } ``` 在上面的例子中,我们设置了进度条的宽度为 200 像素,高度为 20 像素,进度条的颜色为蓝色,进度条的方向为水平方向。 进度条还可以通过绑定属性来动态更新进度值。例如,可以将进度条的值与后台任务的进度相关联,实时更新进度条的显示: ``` ProgressBar { id: progressBar value: backendTask.progress } SomeBackendTask { id: backendTask onProgressChanged: { progressBar.value = progress } } ``` 在上面的例子中,我们将进度条的值绑定到后台任务的 progress 属性,当后台任务的进度改变时,进度条的值也会相应地改变。 Qt QML 提供了丰富的功能和样式选项,可以根据实际需求进行进一步的定制和扩展。以上是关于如何在 Qt QML 中使用进度条的简单介绍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值