首页 > 编程语言 >Qt/C++开源控件 圆形进度条

Qt/C++开源控件 圆形进度条

时间:2024-10-13 16:33:29浏览次数:6  
标签:QColor 控件 CircularProgress Qt 进度条 int void height painter

Qt/C++开源控件 圆形进度条

  • 简约风格: 设计简洁,没有多余的元素,清晰地显示了当前进度。
  • 颜色对比: 使用了亮色的蓝色来标示进度,与深色背景形成鲜明对比,使得进度指示一目了然。
  • 清晰的刻度: 刻度线清晰,尽管没有标注所有数字,但通过较长的刻度线在50和100的位置,用户可以很容易地估计进度。
  • 指针设计: 指针末端带有一个圆形装饰,这不仅美观而且提高了指针指向的清晰度。
  • 中心百分比显示: 进度的数值以大号字体在控件中心显示,用户可以快速读取数值信息。

#ifndef CIRCULARPROGRESS_H
#define CIRCULARPROGRESS_H

#include <QWidget>
#include <QColor>

class CircularProgress : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged)
    Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor)
    Q_PROPERTY(QColor scaleColor READ scaleColor WRITE setScaleColor)

public:
    explicit CircularProgress(QWidget *parent = 0);
    ~CircularProgress();

    int value() const;
    QColor backgroundColor() const;
    QColor scaleColor() const;

public slots:
    void setValue(int newValue);
    void setBackgroundColor(const QColor &color);
    void setScaleColor(const QColor &color);

signals:
    void valueChanged(int newValue);

protected:
    void paintEvent(QPaintEvent *event) override;

private:
    int m_value;
    QColor m_backgroundColor;
    QColor m_progressColor;
    QColor m_textColor;
    QColor m_scaleColor;

    void drawBackground(QPainter &painter);
    void drawProgress(QPainter &painter);
    void drawHandle(QPainter &painter, double angle);
    void drawScale(QPainter &painter);
};

#endif // CIRCULARPROGRESS_H

#include "circularprogress.h"
#include <QPainter>
#include <QPainterPath>
#include <QtMath>

CircularProgress::CircularProgress(QWidget *parent):
    QWidget(parent),
    m_value(0),
    m_backgroundColor(QColor(100, 100, 100)),//默认背景颜色为灰色
    m_progressColor(Qt::green),
    m_textColor(Qt::white),
    m_scaleColor(Qt::white)//默认刻度线颜色为白色
{
}

CircularProgress::~CircularProgress()
{

}


int CircularProgress::value() const
{
    return m_value;
}

QColor CircularProgress::backgroundColor() const
{
    return m_backgroundColor;
}

QColor CircularProgress::scaleColor() const
{
    return m_scaleColor;
}

void CircularProgress::setValue(int newValue)
{
    if (newValue < 0 || newValue > 100)
    {
        return;
    }
    if (m_value != newValue)
    {
        m_value = newValue;
        emit valueChanged(newValue);
        update();
    }
}

void CircularProgress::setBackgroundColor(const QColor &color)
{
    if (m_backgroundColor != color)
    {
        m_backgroundColor = color;
        update();
    }
}

void CircularProgress::setScaleColor(const QColor &color)
{
    if (m_scaleColor != color)
    {
        m_scaleColor = color;
        update();
    }
}

void CircularProgress::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    drawBackground(painter);
    drawScale(painter);
    drawProgress(painter);
    drawHandle(painter, (m_value / 100.0) * 270.0);//根据进度计算角度
}

void CircularProgress::drawBackground(QPainter &painter)
{
    painter.fillRect(rect(), m_backgroundColor);//绘制背景色
}

void CircularProgress::drawProgress(QPainter &painter)
{
    int width = this->width() - 10;
    int height = this->height() - 10;
    int radius = qMin(width, height) / 2 - 30;//留出边距
    QRectF rectangle(width / 2 - radius, height / 2 - radius, 2 * radius, 2 * radius);

    painter.setPen(QPen(m_progressColor, 5));
    //从左下方开始顺时针到右下方结束,角度计算从(-135°)到(45°)
    int startAngle = -135 * 16;
    int spanAngle = -(m_value / 100.0) * 270 * 16;
    painter.drawArc(rectangle, startAngle, spanAngle);
}

void CircularProgress::drawHandle(QPainter &painter, double angle)
{
    int width = this->width() - 10;
    int height = this->height() - 10;
    int radius = qMin(width, height) / 2 - 30;//留出边距
    int handleRadius = 5;//小圆点的半径

    //将角度从进度条的0%(225°)转换为顺时针角度
    double radian = qDegreesToRadians(-225 + angle);
    int centerX = width / 2 + (radius) * cos(radian);
    int centerY = height / 2 + (radius) * sin(radian);

    painter.setBrush(m_progressColor);
    painter.drawEllipse(QPointF(centerX, centerY), handleRadius, handleRadius);
}

void CircularProgress::drawScale(QPainter &painter)
{
    int width = this->width() - 10;
    int height = this->height() - 10;
    int radius = qMin(width, height) / 2 - 45;//刻度位于进度条内
    painter.setPen(QPen(m_scaleColor, 2));

    for (int i = 0; i <= 100; i += 10)
    {
        //从225°开始到-45°结束,确保顺时针方向
        double angle = -225 + (i / 100.0) * 270;
        double radian = qDegreesToRadians(angle);
        int outerX = width / 2 + radius * cos(radian);
        int outerY = height / 2 + radius * sin(radian);
        int innerX = width / 2 + (radius - 20) * cos(radian);//刻度线长度为10
        int innerY = height / 2 + (radius - 20) * sin(radian);

        painter.drawLine(QPointF(innerX, innerY), QPointF(outerX, outerY));

        //刻度文字
        QString text = QString::number(i);
        QFontMetrics fm(painter.font());
        int textX = width / 2 + (radius + 25) * cos(radian) - fm.width(text) / 2;
        int textY = height / 2 + (radius + 25) * sin(radian) - fm.height() / 3;
        painter.drawText(textX, textY, text);
    }

    //中心百分比文字
    painter.setPen(m_textColor);
    painter.setFont(QFont("Arial", 20, QFont::Bold));
    painter.drawText(rect(), Qt::AlignCenter, QString::number(m_value) + "%");
}

标签:QColor,控件,CircularProgress,Qt,进度条,int,void,height,painter
From: https://www.cnblogs.com/milkchocolateicecream/p/18462520

相关文章

  • Qt/C++音视频开发-多级连保存和推流设计
    Qt/C++音视频开发-多级连保存和推流设计介绍多级连保存和推流设计是一种将音视频内容同时保存到多个文件或推流到多个平台的技术。这种设计能够增加数据冗余、提高访问速度,确保数据安全性,并且可以实现同时在多个平台上进行直播,提高内容的覆盖面和用户体验。应用使用场景......
  • Qt开发技巧(十六):文本框的光标处理,数据库的int在视图中展示问题,工程文件中区分系统及硬
    继续讲一些Qt开发中的技巧操作:1.文本框的光标处理正常情况下我们在文本框中输入,光标会一直伴随着我们的输入指向最后,有点像链表的next指针,但有时候文本框中的内容过长,而我们想要主动设置下将光标移到最前面的时候,可以用下面方法。//下面三种方法都可以//1.样式表方式设......
  • 在Qt Creator中使用vcpkg:综合指南
    在QtCreator中使用vcpkg,尤其是在Windows的MinGW环境下,集成可能会遇到挑战。本指南探讨了在QtCreator中使用vcpkg的不同方法,重点关注推荐的vcpkg.json清单文件方法。1.使用vcpkg.json清单文件(推荐)vcpkg.json清单文件是现代化的、项目本地化的管理方法。它非常适合需要精确依赖......
  • Qt自定义一个圆角对话框
    如何得到一个圆角对话框?步骤:1、继承自QDiaglog2、去掉系统自带的边框3、设置背景透明,不设置4个角会有多余的部分出现颜色4、对话框内部添加1个QWidget,给这个widget设置圆角,并添加到布局中让他充满对话框5、后续对话框的所有内容都添加在这个widget里面举例:#ifndefRO......
  • Qt全屏显示和按键ESC退出全屏
    1.需求描述将播放窗口全屏显示,将工具栏边框等隐藏在后面;然后退出全屏通过ESC返回按钮;2.实现方法定义一个全屏的容器类,继承于QWidget;全屏时,去掉窗口的父窗口,然后全屏显示,不去掉父窗口指针无法全屏;按下ESC按钮后,通过keyPressEvent(QKeyEvent*pEvent);函数,将父窗口重新设置回去;......
  • qt5widgets.dll丢失导致腾讯课堂无法打开难题:qt5widgets.dll文件缺失快速解决策略
    面对qt5widgets.dll文件丢失导致腾讯课堂无法打开的难题,以下提供一套快速解决策略,帮助您迅速恢复腾讯课堂的正常使用。一、了解qt5widgets.dll文件的重要性qt5widgets.dll是Qt5框架中的一个动态链接库文件,它提供了丰富的用户界面元素和功能,是许多基于Qt5开发的应用程序所必......
  • PyQt5/6 PySide2/6 在任务栏托盘区域编程,用于显示文字(图片)信息
    PyQt5/6PySide2/6在任务栏编程,用于显示文字(图片)信息本文使用PyQt5演示,其他库如PySide2/6,稍微改改就能用,因为其核心使用的是Win32gui来获取一些系统信息代码结构本文中全部代码全在test_taskbar.py这一个文件中编码,步骤中有变动的地方会注释标注,无改动的不会重复显示出来,需要......
  • WPF 性能优化-列表控件性能
    下面记录几种针对大数据列表控件性能的增强特性,WPF所有继承自ItemsControl的控件(列表控件)都支持这些增强特性,包括ListBox、ComboBox、ListView、TreeView以及DataGrid。一、虚拟化WPF列表控件所提供的最重要的功能就是UI虚拟化。UI虚拟化是列表只为可见区域中能显示的项创建容器......
  • 界面控件DevExpress中文教程 - 如何拓展具有AI功能的文本编辑器(二)
    NLP是人工智能的一个分支,它允许计算机与人类语言进行交互,这包括以有意义/有用的方式理解、解释、生成和回应文本(和语音)的能力。基于NLP的功能允许更好的数据分析、个性化体验、高效的沟通,并导致更明智的决策和提高效率。例如:机器翻译文本摘要文本生成文本分类以及更多…......
  • Qt,提升QLabel
     QLabel不能满足我的需求,需要提升QLabel为自己封装的类 在UI中,拉一个QLabel出来,鼠标右键点击QLabel,选择【提升为】,然后填写自己的类。 需要注意的是,提升后QLabel需要show一下,不然显示不出来 #ifndefMYVIDEO_H#defineMYVIDEO_H#include<QLabel>#include<QWidge......