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(); }