首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

QT环形进度条(圆形进度条)

后端 7.64KB 19 需要积分: 1
立即下载

资源介绍:

在Qt自带的控件中,只有垂直进度条、水平进度条两种。在平时做页面开发时,有些时候会用到环形进度条,比如说:下载某个文件的下载进度。本示例使用QT实现一个自定义环形进度条。
#include "roundprogressbar.h" #include #include RoundProgressBar::RoundProgressBar(QWidget *parent) : QWidget(parent), m_min(0), m_max(100), m_value(25), m_startAngle(0), m_barStyle(StyleDonut), m_outlinePenWidth(1), m_dataPenWidth(1), m_rebuildBrush(false), m_format("%p%"), m_decimals(1), m_clockwise(true), m_baseCircleVisible(true), m_dataCircleVisible(true), m_centerCircleVisible(true), m_textVisible(true), m_updateFlags(UF_PERCENT) { } RoundProgressBar::~RoundProgressBar() { } void RoundProgressBar::setStartAngle(double angle) { if (angle != m_startAngle) { m_startAngle = angle; update(); } } void RoundProgressBar::setBarStyle(RoundProgressBar::BarStyle style) { if (style != m_barStyle) { m_barStyle = style; update(); } } void RoundProgressBar::setOutlinePenWidth(double penWidth) { if (penWidth != m_outlinePenWidth) { m_outlinePenWidth = penWidth; update(); } } void RoundProgressBar::setDataPenWidth(double penWidth) { if (penWidth != m_dataPenWidth) { m_dataPenWidth = penWidth; update(); } } void RoundProgressBar::setDataColors(const QGradientStops &stopPoints) { if (stopPoints != m_gradientData) { m_gradientData = stopPoints; m_rebuildBrush = true; update(); } } void RoundProgressBar::setFormat(const QString &format) { if (format != m_format) { m_format = format; valueFormatChanged(); } } void RoundProgressBar::setDecimals(int count) { if (count >= 0 && count != m_decimals) { m_decimals = count; valueFormatChanged(); } } void RoundProgressBar::setClockwise(bool clockwise) { if(clockwise != m_clockwise) { m_clockwise = clockwise; update(); } } void RoundProgressBar::setRange(double min, double max) { m_min = min; m_max = max; if (m_max < m_min) qSwap(m_max, m_min); if (m_value < m_min) m_value = m_min; else if (m_value > m_max) m_value = m_max; update(); } void RoundProgressBar::setValue(int val) { setValue((double)val); } void RoundProgressBar::setValue(double val) { if (m_value != val) { if (val < m_min) m_value = m_min; else if (val > m_max) m_value = m_max; else m_value = val; update(); } } void RoundProgressBar::setBaseCircleVisible(bool visible) { if(visible != m_baseCircleVisible) { m_baseCircleVisible = visible; update(); } } void RoundProgressBar::setDataCircleVisible(bool visible) { if(visible != m_dataCircleVisible) { m_dataCircleVisible = visible; update(); } } void RoundProgressBar::setCenterCircleVisible(bool visible) { if(visible != m_centerCircleVisible) { m_centerCircleVisible = visible; update(); } } void RoundProgressBar::setTextVisible(bool visible) { if(visible != m_textVisible) { m_textVisible = visible; update(); } } void RoundProgressBar::paintEvent(QPaintEvent *event) { Q_UNUSED(event); double outerRadius = qMin(width(), height()); QRectF baseRect(1, 1, outerRadius-2, outerRadius-2); QImage buffer(outerRadius, outerRadius, QImage::Format_ARGB32_Premultiplied); QPainter p(&buffer); p.setRenderHint(QPainter::Antialiasing); //data brush rebuildDataBrushIfNeeded(); // background drawBackground(p, buffer.rect()); // base circle if(m_baseCircleVisible) drawBase(p, baseRect); // data circle double delta = (m_max - m_min) / (m_value - m_min); if(m_dataCircleVisible) drawValue(p, baseRect, m_value, delta); // center circle double innerRadius(0); QRectF innerRect; calculateInnerRect(baseRect, outerRadius, innerRect, innerRadius); if(m_centerCircleVisible) drawInnerBackground(p, innerRect); // text if(m_textVisible) drawText(p, innerRect, innerRadius, m_value); // finally draw the bar p.end(); QTransform transform; transform.translate((width()-outerRadius)/2, (height()-outerRadius)/2); QPainter painter(this); painter.setTransform(transform); painter.fillRect(baseRect, palette().background()); painter.drawImage(0,0, buffer); } void RoundProgressBar::drawBackground(QPainter &p, const QRectF &baseRect) { p.fillRect(baseRect, palette().background()); } void RoundProgressBar::drawBase(QPainter &p, const QRectF &baseRect) { switch (m_barStyle) { case StyleDonut: p.setPen(QPen(palette().shadow().color(), m_outlinePenWidth)); p.setBrush(palette().base()); p.drawEllipse(baseRect); break; case StylePie: p.setPen(QPen(palette().base().color(), m_outlinePenWidth)); p.setBrush(palette().base()); p.drawEllipse(baseRect); break; case StyleLine: p.setPen(QPen(palette().base().color(), m_outlinePenWidth)); p.setBrush(Qt::NoBrush); p.drawEllipse(baseRect.adjusted(m_outlinePenWidth/2, m_outlinePenWidth/2, -m_outlinePenWidth/2, -m_outlinePenWidth/2)); break; default: break; } } void RoundProgressBar::drawValue(QPainter &p, const QRectF &baseRect, double value, double delta) { if (value == m_min) return; // for Line style if (m_barStyle == StyleLine) { p.setPen(QPen(palette().highlight().color(), m_dataPenWidth)); p.setBrush(Qt::NoBrush); if (value == m_max) { p.drawEllipse( baseRect.adjusted(m_outlinePenWidth/2, m_outlinePenWidth/2, -m_outlinePenWidth/2, -m_outlinePenWidth/2)); } else { double arcLength = 360.0 / delta; p.drawArc( baseRect.adjusted(m_outlinePenWidth/2, m_outlinePenWidth/2, -m_outlinePenWidth/2, -m_outlinePenWidth/2), m_startAngle * 16, m_clockwise?-arcLength * 16:arcLength * 16); } return; } // for Pie and Donut styles QPainterPath dataPath; dataPath.setFillRule(Qt::WindingFill); // pie segment outer if (value == m_max) { dataPath.addEllipse(baseRect); } else { double arcLength = 360.0 / delta; dataPath.moveTo(baseRect.center()); dataPath.arcTo(baseRect, m_startAngle, m_clockwise?-arcLength:arcLength); dataPath.lineTo(baseRect.center()); } p.setBrush(palette().highlight()); p.setPen(QPen(palette().shadow().color(), m_dataPenWidth)); p.drawPath(dataPath); } void RoundProgressBar::calculateInnerRect(const QRectF &/*baseRect*/, double outerRadius, QRectF &innerRect, double &innerRadius) { // for Line and Expand styles if (m_barStyle == StyleLine) { innerRadius = outerRadius - m_outlinePenWidth; } else // for Pie and Donut styles { innerRadius = outerRadius * 0.75; } double delta = (outerRadius - innerRadius) / 2; innerRect = QRectF(delta, delta, innerRadius, innerRadius); } void RoundProgressBar::drawInnerBackground(QPainter &p, const QRectF &innerRect) { if (m_barStyle == StyleDonut) { p.setBrush(palette().alternateBase()); p.drawEllipse(innerRect); } } void RoundProgressBar::drawText(QPainter &p, const QRectF &innerRect, double innerRadius, double value) { if (m_format.isEmpty()) return; // !!! to revise QFont f(font()); f.setPixelSize(10);

资源文件列表:

RoundProgressBar.zip 大约有8个文件
  1. RoundProgressBar/
  2. RoundProgressBar/main.cpp 203B
  3. RoundProgressBar/roundprogressbar.cpp 9.64KB
  4. RoundProgressBar/roundprogressbar.h 3.05KB
  5. RoundProgressBar/RoundProgressBar.pro 786B
  6. RoundProgressBar/roundprogressbartest.cpp 3.86KB
  7. RoundProgressBar/roundprogressbartest.h 721B
  8. RoundProgressBar/roundprogressbartest.ui 10.83KB
0评论
提交 加载更多评论
其他资源 注册中心nacos文件夹
注册中心nacos文件夹
图片转PDF及PDF转TXT证件防伪水印工具
图片转PDF及PDF转TXT证件防伪水印工具,实现方式仅供学习参考。
串口modbusRTU通讯学习程序
学习DCS电脑组态跟PLC modbus RTU 通讯的练习软件
QT自定义无边框窗口(移动控制和窗口大小调整)
本示例介绍了如何使用Qt框架创建一个无边框窗口,并提供了详细的源码,包括窗口样式设置、移动区域控制和窗口大小调整功能。用于设置窗口为无边框窗口。可为窗口添加自定义标题栏、边框和系统菜单按钮。
Spring源码注解版
Spring源码注解版
tomcat11111111111111
tomcat11111111111111
理发店预约与支付小程序v2024.3
理发师可以在小程序上设置自己的可预约时间,价格,自我介绍,顾客可以根据理发师的日程安排选择合适的时间进行预约和支付。这样可以提高预约的效率,减少沟通成本,方便双方的安排。 主要功能如下: 首页展示:展示最新的公告通知、理发师推荐等内容,吸引用户关注。 理发师列表:列出所有在班的理发师信息,包括个人简介、星级、理发价格等,方便用户选择合适的理发师。 预约功能:用户可以根据自己的需求选择理发师,进行预约并支付费用。 预约管理:用户可以查看自己的预约记录,包括已完成的预约和待核销的预约,也可以取消预约(所支付费用原路退回)。
835706473238656Painter.zip
835706473238656Painter.zip