qt画半圆环比例图

在这里插入图片描述

#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();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值