首页 > 其他分享 >自定义圆形进度条控件

自定义圆形进度条控件

时间:2024-11-10 15:57:32浏览次数:5  
标签:控件 Qt 自定义 进度条 CircleProgressBar QWidget include painter

以下将以创建一个简单的为例,详细说明在Qt中创建自定义控件的步骤:

一、创建项目

首先,打开Qt Creator并创建一个新的Qt Widgets Application项目。按照向导完成项目的基本设置,比如项目名称、存储路径等。

二、创建自定义控件类

  1. 继承基础控件类
    • 在项目中创建一个新的C++类,命名为 CircleProgressBar。让这个类继承自 QWidget,因为我们要创建一个独立的可视化控件,QWidget 是Qt中大多数可视化控件的基类。
#include <QWidget>

class CircleProgressBar : public QWidget
{
    Q_OBJECT
public:
    explicit CircleProgressBar(QWidget *parent = nullptr);

signals:

public slots:

private:

};
  1. 添加构造函数
    • CircleProgressBar 类中添加构造函数,用于初始化控件的一些基本属性,如大小、颜色等。
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>

class CircleProgressBar : public QWidget
{
    Q_OBJECT
public:
    explicit CircleProgressBar(QWidget *parent = nullptr) : QWidget(parent)
    {
        setFixedSize(200, 200); // 设置控件的固定大小为直径200像素的圆形
        progress = 0; // 初始进度为0
        backgroundColor = Qt::lightGray; // 设置背景颜色为浅灰色
        progressColor = Qt::blue; // 设置进度条颜色为蓝色
    }

signals:

public slots:

private:
    int progress;
    QColor backgroundColor;
    QColor progressColor;
};

在上述构造函数中,通过调用 setFixedSize 函数设置了控件的大小为一个直径200像素的圆形。同时,初始化了进度值为0,并设置了背景颜色和进度条颜色。

三、重写绘制事件函数

为了能够在控件上绘制出圆形进度条的外观,需要重写 QWidgetpaintEvent 函数,在该函数中使用 QPainter 类来进行绘制操作。

#include <QWidget>
#include <QPainter>
#include <QPaintEvent>

class CircleProgressBar : public QWidget
{
    Q_OBJECT
public:
    explicit CircleProgressBar(QWidget *parent = nullptr) : QWidget(parent)
    {
        setFixedSize(200, 200);
        progress = 0;
        backgroundColor = Qt::lightGray;
        progressColor = Qt::blue;
    }

protected:
    void paintEvent(QPaintEvent *event) override
    {
        Q_UNUSED(event);
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing); // 开启抗锯齿,使绘制的图形更平滑

        // 绘制背景圆形
        painter.setPen(Qt::NoPen);
        painter.setBrush(backgroundColor);
        painter.drawEllipse(rect());

        // 绘制进度条圆形
        painter.setPen(Qt::NoPen);
        painter.setBrush(progressColor);
        int arcLength = (progress / 100.0) * 360 * 16; // 根据进度计算弧长,乘以16是因为QPainter绘制弧形的单位要求
        painter.drawArc(rect(), 90 * 16, arcLength);
    }

signals:

public slots:

private:
    int progress;
    QColor backgroundColor;
    QColor progressColor;
};

paintEvent 函数中:

  • 首先创建了一个 QPainter 对象,并开启了抗锯齿功能,以获得更平滑的绘制效果。
  • 然后使用 QPainter 绘制了背景圆形,通过设置画笔为 Qt::NoPen(即不绘制轮廓线),设置画刷为背景颜色,再使用 drawEllipse 函数根据控件的矩形区域(通过 rect() 函数获取)绘制出背景圆形。
  • 接着绘制进度条圆形,同样设置画笔为 Qt::NoPen,画刷为进度条颜色,根据当前进度计算出弧长,再使用 drawArc 函数在背景圆形上绘制出进度条弧形。

四、添加设置进度的函数

为了能够在外部方便地设置圆形进度条的进度值,需要添加一个公共函数来实现此功能。

#include <QWidget>
#include <QPainter>
#include <QPaintEvent>

class CircleProgressBar : public QWidget
{
    Q_OBJECT
public:
    explicit CircleProgressBar(QWidget *parent = nullptr) : QWidget(parent)
    {
        setFixedSize(200, 200);
        progress = 0;
        backgroundColor = Qt::lightGray;
        progressColor = Qt::blue;
    }

    void setProgress(int value)
    {
        progress = value;
        update(); // 更新控件的显示,以便重新绘制进度条
    }

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

        // 绘制背景圆形
        painter.setPen(Qt::NoPen);
        painter.setBrush(backgroundColor);
        painter.drawEllipse(rect());

        // 绘制进度条圆形
        painter.setPen(Qt::NoPen);
        painter.setBrush(progressColor);
        int arcLength = (progress / 100.0) * 360 * 16;
        painter.drawArc(rect(), 90 * 16, arcLength);
    }

signals:

public slots:

private:
    int progress;
    QColor backgroundColor;
    QColor progressColor;
};

setProgress 函数中,首先更新了内部的进度值变量,然后调用 update() 函数,该函数会触发 paintEvent 函数的重新执行,从而根据新的进度值重新绘制进度条。

五、在主窗口中使用自定义控件

  1. 包含头文件
    • 在主窗口的头文件(通常是 mainwindow.h)中,包含自定义控件类的头文件。
#include <QMainWindow>
#include "CircleProgressBar.h"

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    CircleProgressBar *circleProgressBar;
};
  1. 创建并设置自定义控件
    • 在主窗口的构造函数中,创建自定义控件对象,并设置其在主窗口中的位置等属性。
#include <QMainWindow>
#include "CircleProgressBar.h"

MainWindow::MainWindow(QWidget *parent = nullptr) : QMainWindow(parent)
{
    circleProgressBar = new CircleProgressBar(this);
    circleProgressBar->setProgress(50); // 设置初始进度为50%
    circleProgressBar->move(50, 50); // 将控件移动到主窗口的指定位置

    setFixedSize(300, 300); // 设置主窗口的固定大小
}

MainWindow::~MainWindow()
{
    delete circleProgressBar;
}

在上述主窗口的构造函数中,首先创建了 CircleProgressBar 控件对象,并将其所属的父控件设置为当前主窗口。然后设置了初始进度为50%,并将控件移动到主窗口内的指定位置。最后设置了主窗口的固定大小。

通过以上步骤,我们成功创建了一个简单的自定义圆形进度条控件,并在主窗口中进行了使用。你可以根据实际需求进一步扩展和完善这个自定义控件的功能,比如添加动画效果、响应鼠标事件等。

标签:控件,Qt,自定义,进度条,CircleProgressBar,QWidget,include,painter
From: https://www.cnblogs.com/DesertCactus/p/18538100

相关文章

  • Kafka 之自定义消息拦截器【Kafka 拦截器】
    前言:拦截器这个概念相信大部分朋友都不会陌生,SpringMVC拦截器相信大家都用过,拦截器的核心思想就是运行应用程序在不修改业务逻辑的前提下,动态的实现一组可插拔的事件处理器链,它可以在业务链路中的前后各个点进行对应的拦截,做一些统一的处理,SpingMVC的拦截器大家都了解,......
  • 手把手教你搭建Windows+YOLO11+CUDA环境,以EMA注意演示如何改进YOLO11, 训练自定义数据
    YOLOv11目标检测创新改进与实战案例专栏文章目录:YOLOv11创新改进系列及项目实战目录包含卷积,主干注意力,检测头等创新机制以及各种目标检测分割项目实战案例专栏链接:YOLOv11目标检测创新改进与实战案例文章目录YOLOv11目标检测创新改进与实战案例专栏前言本......
  • 织梦网站怎么修改自定义,织梦自定义字段管理
    在织梦CMS中,自定义字段可以帮助你扩展文章或页面的属性,以下是一些管理自定义字段的步骤:登录后台:打开织梦CMS的后台管理页面,输入用户名和密码登录。进入模型管理:在后台左侧菜单中,点击“核心”>“频道模型”>“管理内容模型”。选择模型:选择需要添加自定义字段......
  • 鸿蒙项目实战(三):自定义弹窗开发实践
    自定义弹窗选型合理选择不同的系统能力实现弹窗,有利于提升应用开发效率,实现更好的功能需求,因此了解自定义弹窗的选型和差异非常重要。在应用开发中,为了选择出合适的弹窗选型,从使用场景上,需要重点关注以下两点:弹窗与界面代码解耦在开发业务逻辑时,例如遇到一些网络请求失败的场......
  • ethereum.FilterQuery 日志查询处理自定义事件
    前言:在开发中也是遇到这个问题了,并非常见的Transfer,Approve等在ERC20中定义的事件,只要你的事件在sol文件中存在,那还好处理,但是如果不存在,刚开始接触的时候,你可能就有点懵,我也是找了两天,查阅了很多资料,并没什么niao用,偶然看见了区块浏览器中的log才恍然大悟。问题:Uniswa......
  • 【Linux】为终端命令自定义快件键并弹窗提醒 设置快捷键切换网络代理(Network Proxy)Dis
    【Linux】为终端命令自定义快件键并弹窗提醒设置快捷键切换网络代理(NetworkProxy)Disabled/Manual并弹窗提醒可以自定义快捷键执行终端命令,执行完毕会有弹窗提醒。下面给一个例子,设置快捷键切换网络代理(NetworkProxy)Disabled/Manual并弹窗提醒。适用于Ubuntu系统,为......
  • Linux 终端控件:实时时刻表
    为了看几点才能讨论所以设计的,因此这里面有一个自带的机房时间表,你直接跑就行写得很naive,因为没找到Linux有啥API接口因此你需要在终端里跑如果用Vscode推荐分一个终端挂着否则可以单开一个终端然后置顶终端各种部件和时刻详细信息都提供了快捷修改接口,设置项全都放在......
  • Qt 窗口强制禁用系统阴影(自定义菜单)
    解决方法当只使用Qt::FramelessWindowHint时,不会显示系统阴影,因为自定义菜单一般都会添加Qt::Popup,添加Qt::Popup后系统会默认添加阴影效果。在添加Qt::Popup后,继续添加Qt::NoDropShadowWindowHint枚举解决。 最小复现代码:QDialog*dia=newQDialog();dia->setW......
  • WPF StatusBar控件 这一块也能放一些东西
    WPFStatusBar控件这一块也能放一些东西  StatusBar控件一般在窗口的底部。用于显示有关应用程序当前状态的各种信息,如光标位置、字数、任务进度等。<Windowx:Class="WpfApp14.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"......
  • WPF Menu控件 我也有个不能点菜的菜单
    WPFMenu控件我也有个不能点菜的菜单 Windows应用程序最常见的部分之一是菜单,有时也称为主菜单,因为应用程序中通常只有一个。菜单很实用,因为它提供了很多选项,只占用很少的空间。向其中添加菜单项非常简单-您只需向其中添加MenuItem元素,并且每个MenuItem可以具有一系列......