三、黑马时钟#

黑马时钟#

时钟是由多个绘制单元组成:

刻度:绘制直线

文字:绘制文字

时针:绘制多边形

分针:绘制多边形

秒针:绘制多边形

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include "MainWindow.h"

//时针的点
const QPoint MainWindow::hourHand[4] = {
        QPoint(3, 5),
        QPoint(0, 13),
        QPoint(-3, 5),
        QPoint(0, -40)
};
//分针的点
const QPoint MainWindow::minuteHand[4] = {
        QPoint(3, 5),
        QPoint(0, 16),
        QPoint(-3, 5),
        QPoint(0, -70)
};
//秒针的点
const QPoint MainWindow::secondHand[4] = {
        QPoint(3, 5),
        QPoint(0, 18),
        QPoint(-3, 5),
        QPoint(0, -90)
};


MainWindow::MainWindow(QWidget *parent) : QWidget(parent),t(this) {
    //设置窗口大小
    setFixedSize(600, 600);
    //定时
    connect(&t,&QTimer::timeout,[this](){
        //再次执行paintEvent方法
        update();//自动执行paintEvent方法
    });
    //开始定时
    t.start(1000);
}

MainWindow::~MainWindow() {

}

//绘制方法
void MainWindow::paintEvent(QPaintEvent *event) {
    //创建Qpainter
    QPainter painter(this);
    //抗锯齿
    painter.setRenderHint(QPainter::Antialiasing, true);
    //设置画家对象的圆形在300,300
    painter.translate(300, 300);
    //绘制刻度
    drawScale(painter);
    //绘制秒针
    drawSecond(painter);
    //绘制分针
    drawMin(painter);
    //绘制时针
    drawHour(painter);
}

//绘制表盘
void MainWindow::drawScale(QPainter &painter) {
    for (int i = 1; i <= 60; ++i) {
        //保存当前的状态
        painter.save();
        //旋转
        painter.rotate(6 * i);
        if (i % 5 == 0) {
            painter.drawLine(0, -98, 0, -82);
            //绘制文字
            painter.drawText(-20,-80,40,40,Qt::AlignHCenter,QString::number(i/5));
        } else {
            painter.drawLine(0, -98, 0, -88);
        }

        //恢复原来的状态
        painter.restore();
    }
}


//时针
void MainWindow::drawHour(QPainter &painter){
    //获取当前的时间
    int hour = QTime().currentTime().hour();
    int min = QTime().currentTime().minute();
    //保存状态
    painter.save();
    //旋转
    painter.rotate(30*hour+30*(min/(float)60));
    //创建画刷
    QBrush brush(Qt::black);
    //设置画刷
    painter.setBrush(brush);
    painter.drawConvexPolygon(hourHand,4);
    //恢复
    painter.restore();
}
//分针
void MainWindow::drawMin(QPainter &painter){
    //获取当前的时间
    int second = QTime().currentTime().minute();
    //保存状态
    painter.save();
    //旋转
    painter.rotate(6*second);
    //创建画刷
    QBrush brush(Qt::blue);
    //设置画刷
    painter.setBrush(brush);
    painter.drawConvexPolygon(minuteHand,4);
    //恢复
    painter.restore();
}
//秒针
void MainWindow::drawSecond(QPainter &painter){
    //获取当前的时间
    int second = QTime().currentTime().second();
    //保存状态
    painter.save();
    //旋转
    painter.rotate(6*second);
    //创建画刷
    QBrush brush(Qt::red);
    //设置画刷
    painter.setBrush(brush);
    painter.drawConvexPolygon(secondHand,4);

    //恢复
    painter.restore();
}