Qt工作笔记-QML自定义圆形进度条(C++后端处理数据)

本文介绍如何使用QML与C++结合,通过Canvas组件和定时器实现实时更新的进度圆形显示。文章详细展示了如何将C++类映射到QML环境中,并通过计时器获取进度值,最终在QML界面中动态展示进度变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

原理

源码


 

原理

1.使用QML中的Canvas绘制圆形,用一种颜色,说明是未读取,再用另外一种颜色覆盖到原来的颜色!说明进度!

2.使用setContextProperty把C++中的某个继承了QObject的类映射到QML中!

3.QML中有一个计时器,去实时读取QObject中的进度!

 

程序运行截图如下:

 

源码

程序结构如下:

源码如下:

mycicular.h

#ifndef MYCICULAR_H
#define MYCICULAR_H

#include <QObject>

QT_BEGIN_NAMESPACE
class QTimer;
QT_END_NAMESPACE

class MyCicular : public QObject
{
    Q_OBJECT
public:
    MyCicular(QObject *parent = 0);
    ~MyCicular();

    Q_INVOKABLE int getCurrentValue();
    Q_INVOKABLE void finished();

protected slots:
    void addValueTimeout();

private:

    int m_endValue;
    int m_startValue;
    QTimer *m_timer;
};

#endif // MYCICULAR_H

main.cpp

#include <QApplication>
#include <QQuickView>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "mycicular.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MyCicular myCicular;
    QQuickView view;
    view.engine()->rootContext()->setContextProperty("canvas", &myCicular);
    view.setResizeMode(QQuickView::SizeViewToRootObject);
    view.setSource(QUrl("qrc:/main.qml"));
    view.show();


    return a.exec();
}

mycicular.cpp

#include "mycicular.h"
#include <QTimer>
#include <QDebug>
#include <QMessageBox>

MyCicular::MyCicular(QObject *parent) : QObject(parent)
{

    m_startValue = 0;
    m_endValue = 1000;

    m_timer = new QTimer;
    connect(m_timer, SIGNAL(timeout()), this, SLOT(addValueTimeout()));

    m_timer->start(5);
}

MyCicular::~MyCicular()
{
    delete m_timer;
}

int MyCicular::getCurrentValue()
{
    return ((double)m_startValue / (double)m_endValue) * 360;
}

void MyCicular::finished()
{
    QMessageBox::information(NULL, "提示", "程序读取结束");
}

void MyCicular::addValueTimeout()
{
    m_startValue++;
    if(m_startValue >= m_endValue){

        m_timer->stop();
    }
}

CircularProgress.qml

import QtQuick 2.4

Canvas{

    property int radius: 100
    property real progress: 0
    property real arcWidth: 2

    id:canvas
    width: 2 * radius + arcWidth
    height: 2 * radius + arcWidth

    Text{

        anchors.centerIn: parent
        font.pointSize: 15
        text: Math.floor((parent.progress / 360) * 100) + "%"
    }


    onPaint:{

        var ctx = getContext("2d")

        ctx.beginPath()
        ctx.strokeStyle = "#AAAAAA"
        ctx.lineWidth = 2
        ctx.arc(width / 2, height / 2, radius, 0, Math.PI * 2, false)
        ctx.stroke()

        var r = progress * Math.PI / 180
        ctx.beginPath()
        ctx.strokeStyle = "#148014"
        ctx.lineWidth = 2

        ctx.arc(width / 2, height / 2, radius, 0 - 90 * Math.PI / 180
                , r - 90 * Math.PI / 180, false)
        ctx.stroke()
    }
}

main.qml

import QtQuick 2.7
import QtQuick.Controls 2.0

Item {

    visible: true
    width: 400
    height: 300

    CircularProgress{

        id: circularProgress
        anchors.centerIn: parent
    }

    Timer{

        id: timer
        running: true
        repeat: true
        interval: 100
        onTriggered: {

            console.log(circularProgress.progress)
            if(circularProgress.progress == 360){
                timer.running = false
                canvas.finished()
            }


            circularProgress.progress = canvas.getCurrentValue()
            circularProgress.requestPaint()
        }
    }
}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值