效果展示
功能概述
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