-
UID:110085
-
- 注册时间2010-12-21
- 最后登录2024-03-25
- 在线时间3536小时
-
- 发帖2734
- 搜Ta的帖子
- 精华2
- 金钱32613
- 威望3359
- 贡献值586
- 好评度3377
-
访问TA的空间加好友用道具
|
一、前言现在web形式的图表框架非常流行,国产代表就是echart,本人用过几次,三个字屌爆了来形容,非常强大,而且易用性也非常棒,还是开源免费的,使用起来不要太爽,内置的各种图表和仪表盘等非常丰富,展现形式也是非常多样的。 本次要写的圆弧进度条,就是参考自echart中的一个圆弧进度条,主要结构就是外围一圈圆角进度,中间加上标题和对应进度的百分比,进度条的起始角度和结束角度可以自行调整,这样的话进度条的开口就可以在左边右边上边下边等任意位置,通过调整角度就能实现。绘制的核心就是drawArc函数。 二、实现的功能 * 1:可设置范围值,支持负数值 * 2:可设置精确度,最大支持小数点后3位 * 3:可设置圆弧宽度 * 4:可设置开始旋转角度/结束旋转角度 * 5:可设置仪表盘的标题 * 6:可设置背景颜色/进度颜色/值颜色/文字 颜色 * 7:自适应窗体拉伸,文字自动缩放 * 8:可自由拓展各种渐变色 * 9:可设置百分比模式,自动计算值换算成百分比 三、效果图四、头文件代码五、核心代码- void ProgressArc::paintEvent(QPaintEvent *)
- {
- int width = this->width();
- int height = this->height();
- int side = qMin(width, height);
- //绘制准备工作,启用反锯齿,平移坐标轴中心,等比例缩放
- QPainter painter(this);
- painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
- //绘制背景
- if (bgColor != Qt::transparent) {
- painter.setPen(Qt::NoPen);
- painter.fillRect(this->rect(), bgColor);
- }
- painter.translate(width / 2, height / 2);
- painter.scale(side / 200.0, side / 200.0);
- //绘制圆弧
- drawArc(&painter);
- //绘制当前值
- drawValue(&painter);
- //绘制标题
- drawTitle(&painter);
- }
- void ProgressArc::drawArc(QPainter *painter)
- {
- int radius = 99 - arcWidth;
- painter->save();
- painter->setBrush(Qt::NoBrush);
- QPen pen;
- pen.setWidthF(arcWidth);
- pen.setCapStyle(Qt::RoundCap);
- //计算总范围角度,当前值范围角度,剩余值范围角度
- double angleAll = 360.0 - startAngle - endAngle;
- double angleCurrent = angleAll * ((value - minValue) / (maxValue - minValue));
- double angleOther = angleAll - angleCurrent;
- QRectF rect = QRectF(-radius, -radius, radius * 2, radius * 2);
- //绘制圆弧背景
- pen.setColor(baseColor);
- painter->setPen(pen);
- painter->drawArc(rect, (270 - startAngle - angleCurrent - angleOther) * 16, angleOther * 16);
- //绘制圆弧进度
- pen.setColor(arcColor);
- painter->setPen(pen);
- painter->drawArc(rect, (270 - startAngle - angleCurrent) * 16, angleCurrent * 16);
- painter->restore();
- }
- void ProgressArc::drawValue(QPainter *painter)
- {
- int radius = 100;
- painter->save();
- painter->setPen(textColor);
- QFont font;
- font.setPixelSize(40);
- painter->setFont(font);
-
- QString strValue;
- if (percent) {
- double temp = value / (maxValue - minValue) * 100;
- strValue = QString("%1%").arg(temp, 0, 'f', precision);
- } else {
- strValue = QString("%1").arg((double)value, 0, 'f', precision);
- }
- QRectF textRect(-radius, 0, radius * 2, radius / 3);
- painter->drawText(textRect, Qt::AlignCenter, strValue);
- painter->restore();
- }
- void ProgressArc::drawTitle(QPainter *painter)
- {
- double radius = 100;
- painter->save();
- painter->setPen(titleColor);
- QFont font;
- font.setPixelSize(25);
- painter->setFont(font);
- QRectF textRect(-radius, -radius / 2.5, radius * 2, radius / 3);
- painter->drawText(textRect, Qt::AlignCenter, title);
- painter->restore();
- }
|