Qpain自制钟表

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->setWindowOpacity(0.8);
	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");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值