不多说直接上源码:
1.头文件
#ifndef UPGRADEFORM_H
#define UPGRADEFORM_H
#include <QWidget>
#include<QPainter>
#include"qmath.h"
#include<QDebug>
#include<QEvent>
#include<QTimer>
#ifdef quc
#if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
#include <QtDesigner/QDesignerExportWidget>
#else
#include <QtUiPlugin/QDesignerExportWidget>
#endif
class QDESIGNER_WIDGET_EXPORT upgradeForm : public QWidget
#else
class upgradeForm : public QWidget
#endif
{
Q_OBJECT
public:
upgradeForm(QWidget *parent = 0);
~upgradeForm();
void resizeEvent(QResizeEvent *e);
void paintEvent(QPaintEvent *e) override;
void mousePressEvent(QMouseEvent *e) override;
void drawBg(QPainter *painter);
void drawXian(QPainter *painter);
void drawShanxing(QPainter *painter);
void drawRhombus(QPainter *painter);
void setText(QPainter *painter);
void drawCircle(QPainter *painter);
void drawSomeText(QPainter *painter);
void drawSomeLine(QPainter *painter);
public slots:
void updateValue();
private:
QTimer *timer = nullptr;
private:
static int xuanzhuanjiao;
float widthCtrl ;
float heightCtrl ;
float angle ;//菱形内角度
int count ;
bool flag = false;
};
#endif // UPGRADEFORM_H
2.cpp文件
#pragma execution_character_set("utf-8")
#include "upgradeform.h"
int upgradeForm::xuanzhuanjiao = 0;
upgradeForm::upgradeForm(QWidget *parent):QWidget(parent)
{
widthCtrl = width();
heightCtrl = height();
angle = 150;
count = 10;
timer = new QTimer(this);
timer->start(10);
connect(timer,&QTimer::timeout,this,&upgradeForm::updateValue);
}
upgradeForm::~upgradeForm()
{
// delete ui;
}
void upgradeForm::resizeEvent(QResizeEvent *)
{
widthCtrl = width();
heightCtrl = height();
}
/******************************************************
*函数名称:
*函数功能:
*函数参数:
*返回值:
******************************************************/
void upgradeForm::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing|QPainter::TextAntialiasing);
// drawBg(&painter);
// drawRhombus(&painter);
// setText(&painter);
// drawXian(&painter);
drawCircle(&painter);
drawShanxing(&painter);
drawSomeText(&painter);
drawSomeLine(&painter);
}
void upgradeForm::mousePressEvent(QMouseEvent *)
{
flag = true;
update();
// repaint();
qDebug()<<this->width();
qDebug()<<"mouse PRESS ENVENT";
}
/******************************************************
*函数名称:
*函数功能:绘制背景
*函数参数:
*返回值:
******************************************************/
void upgradeForm::drawBg(QPainter *painter)
{
painter->save();
painter->setPen(Qt::NoPen);
painter->setBrush(QColor(220,220,220));
QRectF rectangle(0.0, 0.0, 150, 30);
painter->drawRoundedRect(rectangle,5,15,Qt::RelativeSize);
painter->restore();
}
/******************************************************
*函数名称:
*函数功能:绘制进度滑块
*函数参数:
*返回值:
******************************************************/
void upgradeForm::drawRhombus(QPainter *painter)
{
painter->save();
painter->setPen(Qt::NoPen);
double dd = ((double)widthCtrl)/count/2.0 ;
dd = 0;
float subwidth = widthCtrl/count/2.0f ;
for(int i = 0;i<count;i++)
{
QPointF points[4] = {
QPointF(i*subwidth, 0),
QPointF(qTan((angle-90)*M_PI/180)+i*subwidth,heightCtrl),
QPointF(subwidth+qTan((angle-90)*M_PI/180)+i*subwidth, heightCtrl),
QPointF((i+1)*subwidth, 0.0)
};
painter->drawConvexPolygon(points, 4);
if(i%2 == 0)
painter->setBrush(QColor("#FF0000"));
else
painter->setBrush(QColor("#00FF00"));
}
painter->restore();
}
void upgradeForm::drawXian(QPainter *painter)
{
painter->save();
painter->translate(width()/2,height()/2);
painter->setPen(Qt::NoPen/*QColor("#FF0000")*/);
painter->setBrush(QColor(0,255,0));
painter->setRenderHint(QPainter::Antialiasing);
int startAngle = 00*16;
int spanAngle = 90*16;
painter->drawChord(0,0,180,160,startAngle,spanAngle);
painter->restore();
}
void upgradeForm::drawShanxing(QPainter *painter)
{
painter->save();
painter->setPen(Qt::NoPen);
painter->translate(width()/2,height()/2);
painter->setRenderHint(QPainter::Antialiasing);
int startAngle = 0*16;
int spanAngle = 30*16;
int r = width()>height()?height()/2:width()/2;
QConicalGradient l1(0,0,0);
l1.setColorAt(0,QColor(0,255,0,255));
l1.setColorAt(1/12.0,QColor(0,255,0,0));//30/360
painter->setBrush(l1);
painter->rotate(-90+xuanzhuanjiao);
painter->drawPie(-r/2,-r/2,r,r,startAngle,spanAngle);
painter->restore();
}
void upgradeForm::setText(QPainter *painter)
{
if(flag)
{
painter->save();
painter->drawText(10,10,"鼠标按下事件触发");
painter->restore();
}
}
void upgradeForm::drawCircle(QPainter *painter)
{
painter->save();
painter->translate(width()/2,height()/2);
int r = width()>height()?height()/2:width()/2;
painter->setPen(/*QColor("#00eF00")*/Qt::NoPen);
painter->setBrush(QColor(211,211,211));
painter->drawEllipse(-r/2,-r/2,r,r);
painter->restore();
}
void upgradeForm::drawSomeText(QPainter *painter)
{
painter->save();
painter->setRenderHint(QPainter::Antialiasing);
painter->translate(width()/2,height()/2);
int r = width()>height()?height()/2:width()/2;
QFont font;
font.setPixelSize(15);
painter->setFont(font);
painter->drawText(0,-r/2,"0");
painter->drawText(r/2,0,"90");
painter->drawText(0,r/2+font.pixelSize(),"180");
painter->drawText(-r/2-font.pixelSize(),0,"270");
painter->restore();
}
void upgradeForm::drawSomeLine(QPainter *painter)
{
painter->save();
painter->setRenderHint(QPainter::Antialiasing);
painter->translate(width()/2,height()/2);
painter->setPen(QPen(QColor(0, 206, 209),2,Qt::DotLine));
int r = width()>height()?height()/2:width()/2;
QLineF l1(QPoint(r/2,0),QPoint(-r/2,0));
QLineF l2(QPoint(0,-r/2),QPoint(0,r/2));
QVector<QLineF> vl;
vl.push_back(l1);
vl.push_back(l2);
painter->drawLines(vl);
painter->restore();
}
void upgradeForm::updateValue()
{
if(xuanzhuanjiao>=360)
xuanzhuanjiao = 0;
xuanzhuanjiao++;
update();
}
3.截图