QT-Demo-Colck-01

 

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

 

posted @ 2016-05-16 14:29  红莲教主  阅读(911)  评论(0编辑  收藏  举报