一.钟表的绘制
钟表的绘制包括时针、分针、秒针、刻度盘
1.时针绘制
void Widget::drawHourHand(QPainter painter)
{
QTime time = QTime::currentTime();
QColor HourHandColor(205,193,197,200);
painter->setPen(Qt::NoPen);
painter->setBrush(HourHandColor);
painter->save();
painter->rotate(30.0(time.hour()+time.minute()/60.0));
painter->drawConvexPolygon(hourHand,4);//绘制时针
painter->restore();//绘制图形后复位坐标系
2.分针绘制
void Widget::drawMinuteHand(QPainter painter)
{
QTime time = QTime::currentTime();
QColor HourHandColor(205,175,149,200);
painter->setPen(Qt::NoPen);
painter->setBrush(HourHandColor);
painter->save();
painter->rotate(6.0(time.minute()+time.second()/60.0));
painter->drawConvexPolygon(minuteHand,4);//绘制分针
painter->restore();//绘制图形后复位坐标系
}
3.秒针绘制
void Widget::drawsecondHand(QPainter painter)
{
QTime time = QTime::currentTime();
QColor HourHandColor(193,205,205,200);
painter->setBrush(HourHandColor);
painter->setPen(Qt::NoPen);
painter->save();//保存坐标系,防止坐标系跑偏了
painter->rotate(6.0time.second());//注意是6.0,不是6
painter->drawConvexPolygon(secondHand,4);//绘制秒针
painter->restore();//绘制图形后复位坐标系
4.钟表刻度盘绘制
坐标轴系统每6°为一个分钟刻度,每30°为一个时钟刻度。
void Widget::drawClockDial(QPainter painter)
{
//绘制钟表刻度盘和数字
for (int i = 1; i <=60; ++i)
{
painter->save();
painter->rotate(6i);//坐标轴旋转6度
if (i % 5 == 0)
{
painter->setPen(hourHandPen);
painter->drawLine(0, -98, 0, -82);
painter->drawText(-20, -82, 40, 40,
Qt::AlignHCenter | Qt::AlignTop,
QString::number(i/5));
}
else
{
painter->setPen(minuteHandPen);
painter->drawLine(0, -98, 0, -88);
}
painter->restore();//绘制图形后复位坐标系
}
}
QColor HourHandColor(193,205,205,200);
可以改变四个参数来改变指针颜色,四个参数的含义分别是(red,green,blue,透明度)具体可参见https://www.sojson.com/rgb.html三原色表
二.代码实现
dialog.h文件
#ifndef DIALOG_H
#define DIALOG_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
private:
QPixmap pix;
QPoint dragPosition;
static const QPoint hourHand[4];
static const QPoint minuteHand[4];
static const QPoint secondHand[4];
QPen hourHandPen;
QPen minuteHandPen;
QFont font;
protected:
void paintEvent(QPaintEvent *);
void drawHourHand(QPainter *painter);
void drawMinuteHand(QPainter *painter);
void drawsecondHand(QPainter *painter);
void drawClockDial(QPainter *painter);
};
#endif // DIALOG_H
dialog.cpp文件
#include “dialog.h”
#include “ui_dialog.h”
#include “dialog.h”
#include
#include
-
Widget::Widget(QWidget *parent)
-
QWidget(parent)
{
//hourHandPen = QPen(palette().foreground(), 2.0);//设置小时刻度线为粗黑
//minuteHandPen = QPen(palette().foreground(), 1.0);//设置分钟刻度线为灰
font.setPointSize(10);//字体大小设置为10
setFont(font);
QTimer *timer = new QTimer(this);
timer->start(1000);//一秒钟
connect(timer,SIGNAL(timeout()),this,SLOT(update()));
setWindowTitle("The Clock");
resize(360, 360);
}
Widget::~Widget()
{
}
const QPoint Widget::hourHand[4] = {
QPoint(3, 5),
QPoint(0, 13),
QPoint(-3, 5),
QPoint(0, -40)
};
const QPoint Widget::minuteHand[4] = {
QPoint(3, 5),
QPoint(0, 16),
QPoint(-3, 5),
QPoint(0, -70)
};
const QPoint Widget::secondHand[4] = {
QPoint(3, 5),
QPoint(0, 18),
QPoint(-3, 5),
QPoint(0, -90)
};
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
int side = qMin(width(), height());
painter.setViewport((width() - side) / 2, (height() - side) / 2,
side, side);
painter.setWindow(0, 0, 200, 200);
painter.translate(100,100);//重新设定坐标原点
drawClockDial(&painter);
drawHourHand(&painter);
drawMinuteHand(&painter);
drawsecondHand(&painter);
painter.setBrush(Qt::black);
painter.drawEllipse(QPoint(0,0),3,3);
}
//画出时针
void Widget::drawHourHand(QPainter painter)
{
QTime time = QTime::currentTime();
QColor HourHandColor(205,193,197,200);
painter->setPen(Qt::NoPen);
painter->setBrush(HourHandColor);
painter->save();
painter->rotate(30.0(time.hour()+time.minute()/60.0));
painter->drawConvexPolygon(hourHand,4);//绘制时针
painter->restore();//绘制图形后复位坐标系
}
//画出分针
void Widget::drawMinuteHand(QPainter painter)
{
QTime time = QTime::currentTime();
QColor HourHandColor(205,175,149,200);
painter->setPen(Qt::NoPen);
painter->setBrush(HourHandColor);
painter->save();
painter->rotate(6.0(time.minute()+time.second()/60.0));
painter->drawConvexPolygon(minuteHand,4);//绘制分针
painter->restore();//绘制图形后复位坐标系
}
//画出秒针
void Widget::drawsecondHand(QPainter painter)
{
QTime time = QTime::currentTime();
QColor HourHandColor(193,205,205,200);
painter->setBrush(HourHandColor);
painter->setPen(Qt::NoPen);
painter->save();//保存坐标系,防止坐标系跑偏了
painter->rotate(6.0time.second());//注意是6.0,不是6
painter->drawConvexPolygon(secondHand,4);//绘制秒针
painter->restore();//绘制图形后复位坐标系
}
//刻写刻度盘
void Widget::drawClockDial(QPainter painter)
{
//绘制钟表刻度盘和数字
for (int i = 1; i <=60; ++i)
{
painter->save();
painter->rotate(6i);//坐标轴旋转6度
if (i % 5 == 0)
{
painter->setPen(hourHandPen);
painter->drawLine(0, -98, 0, -82);
painter->drawText(-20, -82, 40, 40,
Qt::AlignHCenter | Qt::AlignTop,
QString::number(i/5));
}
else
{
painter->setPen(minuteHandPen);
painter->drawLine(0, -98, 0, -88);
}
painter->restore();//绘制图形后复位坐标系
}
}
//鼠标按键响应事件
void Widget::mousePressEvent(QMouseEvent *event){
if(event->button()==Qt::LeftButton){
//计算当前窗体的位置
dragPosition=event->globalPos()-frameGeometry().topLeft();
event->accept();
}
if(event->button()==Qt::RightButton){
close();
}
}
//鼠标移动响应事件
void Widget::mouseMoveEvent(QMouseEvent *event){
if(event->buttons()&Qt::LeftButton){
move(event->globalPos()-dragPosition);
event->accept();
}
}
main.cpp文件
#include “dialog.h”
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
三.运行截图