Qt自定义控件——动态圆形进度条


前言

  本篇通过提升法实现一个动态圆形进度条。

一、需求

  自定义实现一个动态圆形进度条,支持设置进度条颜色、目标值背景色、外边框背景色、中央圆环背景色、旋转角度及大小自适应缩放。同时,支持设置范围值和单位,满足不同场景需要。
  效果如下:
在这里插入图片描述
在这里插入图片描述

二、实现

1、自定义控件类

新建一个自定义控件类,类名为RoundPlot,继承于QWidget类,该类主要负责实现自定义控件。
核心代码如下:

void RoundPlot::drawDial(QPainter *painter)
{
    int radius = 95;
    double lineWidth = 2.5;
    painter->save();
    painter->rotate(angle);

    //根据起始旋转的角度计算每次坐标需要旋转的角度,按照100等分计算
    //每次旋转的角度=360-(起始角度*2--分左右)/100
    double rotate = (double)(360 - (angle * 2)) / 100;

    //绘制已使用百分比
    painter->setPen(QPen(usedColor, lineWidth));

    for (double i = 0; i < currentPercent; i++) {
        painter->drawLine(0, radius, 0, radius / 1.2);
        painter->rotate(rotate);
    }

    //绘制未使用百分比
    painter->setPen(QPen(freeColor, lineWidth));

    for (double i = currentPercent; i < 100; i++) {
        painter->drawLine(0, radius, 0, radius / 1.2);
        painter->rotate(rotate);
    }

    painter->restore();
}

void RoundPlot::drawBgOut(QPainter *painter)
{
    int radius = 70;
    painter->save();
    painter->setPen(Qt::NoPen);
    painter->setBrush(outBgColor);
    painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
    painter->restore();
}

void RoundPlot::drawBgRound(QPainter *painter)
{
    int radius = 50;
    painter->save();
    QConicalGradient conicalGradient(radius, radius, 90);
    conicalGradient.setColorAt(0, centerBgColorStart);
    conicalGradient.setColorAt(1.0, centerBgColorEnd);
    painter->setPen(Qt::NoPen);
    painter->setBrush(conicalGradient);
    painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
    painter->restore();
}

void RoundPlot::drawBgCenter(QPainter *painter)
{
    int radius = 30;
    painter->save();
    painter->setPen(Qt::NoPen);
    painter->setBrush(valueBgColor);
    painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
    painter->restore();
}

void RoundPlot::drawText(QPainter *painter)
{
    int radius = 100;
    painter->save();

    //绘制百分比文字及范围值文字
    double currentValue = currentPercent * ((maxValue - minValue) / 100) + minValue;

    //如果当前值超过了目标值则取目标值
    if (currentValue > value) {
        currentValue = value;
    }

    QString strValue = QString("%1%2").arg(QString::number(currentValue, 'f', precision)).arg(unit);
    QString strMinValue = QString("%1%2").arg(minValue).arg(unit);
    QString strMaxValue = QString("%1%2").arg(maxValue).arg(unit);

    painter->setFont(QFont("Arial", 13));
    painter->setPen(QPen(valueTextColor));
    QFontMetricsF fm = QFontMetricsF(painter->font());
    QSizeF size = fm.size(Qt::TextSingleLine, strValue);
    painter->drawText(-size.width() / 2, size.height() / 3, strValue);

    painter->setFont(QFont("Arial", 8));
    painter->setPen(QPen(rangeTextColor));
    fm = QFontMetricsF(painter->font());
    size = fm.size(Qt::TextSingleLine, strMinValue);
    painter->drawText(-radius / 2 - size.width() / 2 + 8, 80, strMinValue);
    size = fm.size(Qt::TextSingleLine, strMaxValue);
    painter->drawText(radius / 2 - size.width() / 2 - 8, 80, strMaxValue);

    painter->restore();
}

2、提升

在设计师中,将widget控件提升为RoundPlot,如下:
在这里插入图片描述

3、效果

编译运行后,效果如下:
在这里插入图片描述

自定义控件是指开发者根据自己的需求和设计来创建一种新的控件,以便在应用程序中使用。环形进度条是一种常见的自定义控件,它以环形的形式展示进度状态。在Qt中,可以通过以下步骤来创建一个环形进度条自定义控件: 1. 创建一个新的Qt自定义控件类,例如"CustomCircularProgressBar"。这个类应该继承自QWidget或QProgressBar类。QWidget提供了基本的窗口功能,而QProgressBar是一个进度条控件。 2. 在自定义控件类的头文件中,定义私有成员变量来存储进度条的当前值和最大值,并声明一些用于设置和获取这些值的公有方法。 3. 重写自定义控件类的绘图事件函数paintEvent(QPaintEvent *event),在这个函数中绘制环形进度条的外观。可以使用Qt的绘图工具类QPainter来绘制圆形和弧线,并根据当前值和最大值计算出进度的角度。 4. 实现自定义控件类的公有方法,用于设置和获取进度条的当前值和最大值。在这些方法中,更新私有成员变量的值,并调用update()函数来触发控件的重绘。 5. 在应用程序中使用自定义控件类。在Qt的设计工具中,将自定义控件拖放到主窗口或其他需要显示环形进度条的地方,并调用相应的公有方法来设置进度条的值。 通过以上步骤,就可以创建一个自定义的环形进度条控件。开发者可以根据自己的需求,进一步扩展和定制这个控件,例如添加动画效果、改变颜色和样式等。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

敲代码的雪糕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值