Qt编写的圆形Slider滑动条

效果展示

在这里插入图片描述

功能概述

Qt实现一个同QSlider一样可以控制任务进度的圆形滑块(界面中提升类的基础矩形需是一个固定正方形);

完整源码

roundprogessbar.h

#ifndef ROUNDPROGESSBAR_H
#define ROUNDPROGESSBAR_H

#include <QObject>
#include <QWidget>
#include <QPaintEvent>

class RoundProgessBar : public QWidget
{
    Q_OBJECT
public:
    RoundProgessBar(QWidget *parent = nullptr);
    ~RoundProgessBar();
public:
    void setCurProgress(int curVal);
protected:
    void paintEvent(QPaintEvent *event);
private:
    int curProgress;
    QColor borderColor = QColor(0, 191, 255);
};

#endif // ROUNDPROGESSBAR_H

roundprogessbar.cpp

#include <QRect>
#include <QPainter>

constexpr int startPos = 90;
constexpr int radinSpan = 16;
constexpr int borderEdge = 3;

RoundProgessBar::RoundProgessBar(QWidget *parent)
    : QWidget(parent)
    , curProgress(120)
{

}

RoundProgessBar::~RoundProgessBar()
{

}

void RoundProgessBar::setCurProgress(int curVal)
{
    curProgress = curVal;
    update();
}

void RoundProgessBar::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)
    int fixedLength = this->width() < this->height() ?
                this->width() : this->height();
    fixedLength = fixedLength - borderEdge * 2;
    QRect borderRect(borderEdge, borderEdge, fixedLength , fixedLength);

    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    int startAngle = startPos * radinSpan;
    int spanAngle = -curProgress * radinSpan;

    QPen pen(borderColor, borderEdge * 2, Qt::SolidLine, Qt::RoundCap, Qt::BevelJoin);
    painter.setPen(pen);

    // drawArc函数以矩形的中心为弧中心,以水平向右为0度,逆时针为正方向
    painter.drawArc(borderRect, startAngle, spanAngle);
}

主界面类
cirsliderwidget.h

#ifndef CIRSLIDERWIDGET_H
#define CIRSLIDERWIDGET_H

#include <QWidget>
#include "roundprogessbar.h"

QT_BEGIN_NAMESPACE
namespace Ui { class CirSliderWidget; }
QT_END_NAMESPACE

class CirSliderWidget : public QWidget
{
    Q_OBJECT

public:
    CirSliderWidget(QWidget *parent = nullptr);
    ~CirSliderWidget();

private slots:
    void on_dial_sliderMoved(int position);

private:
    Ui::CirSliderWidget *ui;
};
#endif // CIRSLIDERWIDGET_H

cirsliderwidget.cpp

#include "cirsliderwidget.h"
#include "ui_cirsliderwidget.h"

CirSliderWidget::CirSliderWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::CirSliderWidget)
{
    ui->setupUi(this);
}

CirSliderWidget::~CirSliderWidget()
{
    delete ui;
}

void CirSliderWidget::on_dial_sliderMoved(int position)
{
    ui->ringWidget->setCurProgress(position);
    double onePercent =ui->dial->maximum() / 100.00;
    double percentVal = position / onePercent;
    QString percentText = QString::number(percentVal, 'f', 2);
    ui->percentLabel->setText(percentText + "%");
}

界面文件
在这里插入图片描述
[# 源添加链接描述码连接]https://download.csdn.net/download/qq_44896246/87563956

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值