1.演示
2.源码
2.1头文件
#pragma once
#include <QtWidgets/QWidget>
#include "ui_circleTest.h"
#include <QPaintEvent>
class circleTest : public QWidget
{
Q_OBJECT
public:
circleTest(QWidget *parent = Q_NULLPTR);
void drawOuterCircle(QPainter& painter);
void drwaInnerCircle(QPainter& painter);
void drawWatchCircle(QPainter& painter);
void drawLittleScale(QPainter& painter);
void drawBigSacle(QPainter& painter);
void drawNeedles(QPainter& painter);
void saveAllAngles();
protected:
void paintEvent(QPaintEvent *event);
private:
Ui::circleTestClass ui;
QVector<int> vAngle;
};
2.2 cpp
#include "circleTest.h"
#include <QPainter>
#include <QPen>
#include <QtMath>
#include <QDebug>
#include <QDateTime>
#include <QTime>
#include <QTimer>
#define PAI 3.14159265354
#define Border 30
#define inner 10
#define penWidth 2
int r = 0;
int minR = 0;
circleTest::circleTest(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
this->setWindowFlag(Qt::FramelessWindowHint);
this->setAttribute(Qt::WA_TranslucentBackground);
this->resize(480, 480);
this->setStyleSheet("background:transparent");
QTimer* timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, [=] {
this->update();
});
timer->start(1000);
}
void circleTest::drawOuterCircle(QPainter& painter)
{
painter.save();
QLinearGradient gradient(0, 0, 0, height());
gradient.setColorAt(0, QColor(239, 241, 240));
gradient.setColorAt(1, QColor(110, 110, 110));
painter.setBrush(gradient);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.drawEllipse(QPoint(0, 0), minR - penWidth, minR - penWidth);
painter.restore();
}
void circleTest::drwaInnerCircle(QPainter& painter)
{
painter.save();
QLinearGradient gradient2(0, 0, 0, height());
gradient2.setColorAt(0, QColor(255, 255, 255));
gradient2.setColorAt(1, QColor(239, 241, 240));
painter.setBrush(gradient2);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setBrush(QColor(209, 209, 209));
painter.drawEllipse(QPoint(0, 0), minR - Border - penWidth, minR - Border - penWidth);
painter.restore();
}
void circleTest::drawWatchCircle(QPainter& painter)
{
painter.save();
painter.setBrush(Qt::white);
painter.drawEllipse(QPoint(0, 0), r, r);
painter.restore();
}
void circleTest::drawLittleScale(QPainter& painter)
{
int angle2 = -60;
for (int i = 0; i < 60; i++)
{
painter.save();
painter.rotate(angle2);
painter.drawLine(QPoint(r - 4, 0), QPoint(r, 0));
painter.restore();
angle2 += 6;
}
}
void circleTest::drawBigSacle(QPainter& painter)
{
int angle = -60;
for (int i = 1; i <= 12; i++)
{
painter.save();
painter.rotate(angle);
painter.drawLine(QPoint(r - 15, 0), QPoint(r, 0));
painter.restore();
QFont font;
font.setPointSize(14);
font.setFamily("Bahnschrift SemiBold");
painter.setFont(font);
painter.drawText(QPoint((r - 25)*qCos((double(angle) / 180)*PAI), (r - 25)*qSin((double(angle) / 180)*PAI)), QString::number(i));
angle += 30;
}
}
void circleTest::drawNeedles(QPainter& painter)
{
QTime time = QTime::currentTime();
int h = time.hour() % 12;
int m = time.minute();
int s = time.second();
painter.save();
if (m != 60)
{
painter.rotate(vAngle[h * 5 + m / 12]);
}
else
{
painter.rotate(vAngle[h * 5]);
}
QPolygon polygonHour;
polygonHour << QPoint(-8, -4) << QPoint(-8, 4) << QPoint(r - 35, 1) << QPoint(r - 35, -1);
painter.setBrush(Qt::black);
painter.drawPolygon(polygonHour);
painter.restore();
painter.save();
painter.rotate(vAngle[m]);
QPolygon polygonMintue;
polygonMintue << QPoint(-8, -2) << QPoint(-8, 2) << QPoint(r - 15, 1) << QPoint(r - 15, -1);
painter.setBrush(Qt::black);
painter.drawPolygon(polygonMintue);
painter.restore();
painter.save();
painter.rotate(vAngle[s]);
QPolygon polygonSecond;
polygonSecond << QPoint(-8, -1) << QPoint(-8, 1) << QPoint(r - 8, 0.5) << QPoint(r - 8, -0.5);
QPen pen= painter.pen();
pen.setColor(Qt::red);
painter.setPen(pen);
painter.drawPolygon(polygonSecond);
painter.restore();
painter.setBrush(Qt::white);
painter.drawEllipse(QPoint(0, 0), 5, 5);
}
void circleTest::saveAllAngles()
{
int angle3 = -90;
vAngle.resize(60);
for (int i = 0; i < 60; i++)
{
QPoint point((r - 25)*qCos((double(angle3) / 180)*PAI), (r - 25)*qSin((double(angle3) / 180)*PAI));
vAngle[i] = angle3;
angle3 += 6;
}
}
void circleTest::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPen pen;
pen.setWidth(penWidth);
painter.setPen(pen);
painter.setRenderHint(QPainter::Antialiasing, true);
int centerX = this->width() / 2;
int centerY = this->height() / 2;
QPoint point(centerX,centerY );
painter.translate(point);
if (centerX > centerY)
{
minR = centerY;
}
else
{
minR = centerX;
}
r = minR - Border -inner - penWidth;
drawOuterCircle(painter);
drwaInnerCircle(painter);
saveAllAngles();
drawWatchCircle(painter);
drawBigSacle(painter);
drawLittleScale(painter);
drawNeedles(painter);
painter.drawText(QPoint(-36, 36 ), "LONGINES");
}