#pragma once
#include <QWidget>
#include <QPainter>
#include <QPainterPath>
#include <QPaintEvent>
class Semicircular : public QWidget
{
Q_OBJECT
public:
Semicircular(QWidget* parent = nullptr);
~Semicircular();
void paintEvent(QPaintEvent* event);
void drawWifiArc(QPainter& painter, int Hight, int radius, int startAngle, int lenAngle, QRgb color);
void setCurrentValue(double current_value);
private:
QString current_value_string;
double white_span_angle;
private:
Ui::Semicircular ui;
};
#include "Semicircular.h"
Semicircular::Semicircular(QWidget* parent)
: QWidget(parent)
{
ui.setupUi(this);
}
Semicircular::~Semicircular()
{
}
void Semicircular::paintEvent(QPaintEvent* event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
// 平移坐标系原点至中心点
painter.translate(this->width() / 2, (this->height() * 4 / 5));
//画圆弧
//圆弧的半径设置为窗口高度*0。8
double radius = this->height() * 0.8;
//橙色qRgb(255, 130, 0)
//圆弧的高
int height = this->height() / 5;
//qt画圆弧,从右向左画
//先画橙色
drawWifiArc(painter, height, radius, 0, 180, qRgb(255, 130, 0));
drawWifiArc(painter, height, radius, 0, white_span_angle, qRgb(255, 255, 255));
//画出文字
{
QString leftshow = QString("0.00%");
QString rightshow = QString("100.00%");
QFont font("微软雅黑", 15, QFont::Bold, false); //字体,大小,粗体,斜体
font.setCapitalization(QFont::Capitalize); //设置字母大小写
// font.setUnderline(true); //设置下划线
// font.setOverline(true); //设置上划线
// font.setLetterSpacing(QFont::AbsoluteSpacing, 10); //设置字符间的间距
painter.setFont(font);
painter.drawText(QPoint(-radius - 20, 20), leftshow);
painter.drawText(QPoint(radius - 20, 20), rightshow);
}
//画圆弧中间那个文本
painter.save();
{
QFont font1("微软雅黑", 20, QFont::Bold, false); //字体,大小,粗体,斜体
font1.setCapitalization(QFont::Capitalize); //设置字母大小写
// font.setUnderline(true); //设置下划线
// font.setOverline(true); //设置上划线
// font.setLetterSpacing(QFont::AbsoluteSpacing, 10); //设置字符间的间距
painter.setFont(font1);
painter.drawText(QPoint(-50, -10), current_value_string);
}
painter.restore();
}
void Semicircular::setCurrentValue(double current_value)
{
if ((current_value >= 0) && (current_value <= 100))
{
//只能从右边向左边画弧形,所有白色才好变动
white_span_angle = (100 - current_value) * 180.00 / 100.00;
//保留两位小数
current_value_string = QString("%1%2").arg(QString::number(current_value, NULL, 2)).arg("%");
update();
}
}
void Semicircular::drawWifiArc(QPainter& painter, int Hight, int radius, int startAngle, int lenAngle, QRgb color)
{
painter.save();
QRect rect(-radius, -radius, radius * 2, radius * 2);
QPainterPath path;
path.arcTo(rect, startAngle, lenAngle);
QPainterPath subPath;
//坐上加,右下减
subPath.addEllipse(rect.adjusted(Hight, Hight, -Hight, -Hight));
// path为扇形 subPath为椭圆
path -= subPath;
painter.setPen(Qt::NoPen);
painter.setBrush(QColor(color));
painter.drawPath(path);
painter.restore();
}