![]()
![]()
1 QT += widgets
2 QT += core
3
4 HEADERS += \
5 mainwindow.h
6
7 SOURCES += \
8 mainwindow.cpp \
9 main.cpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QWidget>
class Clock : public QWidget
{
Q_OBJECT //每个从QT继承的类都添加这个宏定义
public:
Clock(QWidget* parent = 0);//默认父对象为0,也就是当前窗口为顶级窗口
protected:
void paintEvent(QPaintEvent* e) Q_DECL_OVERRIDE;//只要是覆盖就推荐使用该宏定义
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include <QTimer>
#include <QPoint>
#include <QColor>
#include <QTime>
#include <QPainter>
//默认参数只在申明时写,定义时不写,将默认参数传递给基类QWidget
Clock::Clock(QWidget *parent):QWidget(parent)
{
QTimer* timer = new QTimer(this);//定时器
//每隔一定时间刷新界面
connect(timer,SIGNAL(timeout()),this,SLOT(update()));
timer->start(1000);
setWindowTitle(tr("小小时钟"));
resize(200,200);
}
//没有使用到形参,那么定义的时候就不需要指明形参名字
void Clock::paintEvent(QPaintEvent *)
{
//三点围成一个时针
const QPoint hourPoint[3]=
{
QPoint(7,7),
QPoint(-7,7),
QPoint(0,-60)
};
//三点围成一个分针
const QPoint minPoint[3]=
{
QPoint(7,7),
QPoint(-7,7),
QPoint(0,-70)
};
//三点围成一个秒针
const QPoint secPoint[3]=
{
QPoint(7,7),
QPoint(-7,7),
QPoint(0,-80)
};
//分别定义时分秒针的颜色和透明度
QColor hourColor(125,0,125);
QColor minColor(0,125,125,200);
QColor secColor(255,0,0);
//获取窗体的宽和高的函数首字母是小写
int side = qMin(width(),height());
//获取当前时间
QTime time = QTime::currentTime();
//创建画家
QPainter painter(this);
//抗锯齿
painter.setRenderHint(QPainter::Antialiasing);
//将坐标移动到客户区中间
painter.translate(width()/2,height()/2);
//设置刻度单位为较短的一边的长度的200分之1
//一定要记得加小数点,否则内面小于200时,就会单位刻度为0
painter.scale(side/200.0,side/200.0);
//设置画笔和画刷
painter.setPen(Qt::NoPen);
painter.setBrush(hourColor);
//保存画家,和restore()成对使用,保存还没有旋转的画家
painter.save();
//旋转坐标轴
painter.rotate( 30*(time.hour()+time.minute()/60.0) );
//画多边形
painter.drawConvexPolygon(hourPoint,3);
//还原画家,和save()成对使用,还原到还没有旋转的画家
painter.restore();
//设置画笔,用来画小时刻度
painter.setPen(hourColor);
//旋转12次画小时刻度
for(int i=0;i<12;i++)
{
painter.drawLine(99,0,90,0);
painter.rotate(30);
}
//设置分钟,画刷,画笔
painter.setPen(Qt::NoPen);
painter.setBrush(minColor);
//保存旋转之前的画家
painter.save();
//通过旋转坐标轴画分针
painter.rotate(6*(time.minute()+time.second()/60.0));
painter.drawConvexPolygon(minPoint,3);
//还原画家到未旋转的状态
painter.restore();
//设置画笔颜色,用来画分钟刻度
painter.setPen(minColor);
//通过旋转60次画分钟刻度
for(int i=0;i<60;i++)
{
if(i%5!=0)
painter.drawLine(99,0,95,0);
painter.rotate(6);
}
//设置画笔画刷,用来画秒针
painter.setPen(Qt::NoPen);
painter.setBrush(secColor);
//保存未旋转的画家
painter.save();
//旋转坐标轴用来画秒针
painter.rotate(6*time.second());
painter.drawConvexPolygon(secPoint,3);
//还原画家到未旋转的状态
painter.restore();
}
#include <QApplication>
#include "mainwindow.h"
int main(int argc , char* argv[])
{
QApplication app(argc ,argv);
Clock clock ;
clock.show();
return app.exec();
}