Qt -- 时钟

1. 本文参考其它网友的设计,并进行了改进. 本时钟采用键盘事件,程序运行时,按下键盘的[ESC]键即可关闭程序.

2. 源码如下:

Clock.pro

#-------------------------------------------------
#
# Project created by QtCreator 2016-12-29T10:50:10
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Clock
TEMPLATE = app

RC_FILE += \
    ico.rc

SOURCES += main.cpp\
        clock.cpp

HEADERS  += clock.h

FORMS    += clock.ui


clock.h

#ifndef CLOCK_H
#define CLOCK_H

#include <QWidget>

namespace Ui {
class Clock;
}

class Clock : public QWidget
{
    Q_OBJECT
    
public:
    explicit Clock(QWidget *parent = 0);
    ~Clock();

protected:
    void paintEvent(QPaintEvent *);
    void keyPressEvent(QKeyEvent *);
    
private:
    Ui::Clock *ui;
    int clockTick;
};

#endif // CLOCK_H


clock.cpp

#include <QTimer>
#include <QDate>
#include <QPainter>
#include <QFont>
#include <QKeyEvent>
#include "clock.h"
#include "ui_clock.h"

Clock::Clock(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Clock)
{
    ui->setupUi(this);

    clockTick = 0;

    //-------------------------------------------------------------------------
    // 时钟定时器(信号和槽方式)
    //-------------------------------------------------------------------------
    QTimer *timer = new QTimer(this);       //声明一个定时器
    //update()会自动产生重绘消息, 调用paintEvent()
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
                                            //连接信号槽,定时器超时触发窗体更新
    timer->start(1000);                     //启动定时器
    resize(320, 240);                       //设置窗体大小

    this->setWindowFlags(Qt::FramelessWindowHint);    //无边框
    this->setAttribute(Qt::WA_TranslucentBackground); //背景透明
}

Clock::~Clock()
{
    delete ui;
}

// 重绘事件(由系统的update()槽函数自动调用)
void Clock::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    clockTick++;

    /* 时分秒所描绘不规则形状和长度 */
    // 时针
    static const QPoint hourHand[4] =
    {
        QPoint(7, 8),   //右
        QPoint(0, 13),  //上
        QPoint(-7, 8),  //左
        QPoint(0, -40)  //下
    };
    // 分针
    static const QPoint minuteHand[4] =
    {
        QPoint(7, 8),   //右
        QPoint(0, 13),  //上
        QPoint(-7, 8),  //左
        QPoint(0, -70)  //下
    };
    // 秒针
    static const QPoint secondHand[4] =
    {
        QPoint(7, 8),   //右
        QPoint(0, 13),  //上
        QPoint(-7, 8),  //左
        QPoint(0, -80)  //下
    };

    //-------------------------------------------------------------------------
    /* 时分秒针描绘的颜色 */
    // 时针
    QColor hourColor(127, 0, 127);
    // 分针
    //QColor minuteColor(0, 127, 127, 192);     //RGB(三原色)(0, 127, 127);alpha(透明度)(192).
    QColor minuteColor(0, 127, 127);
    // 秒针
    QColor secondColor(0, 0, 127);

    //-------------------------------------------------------------------------
    int side = qMin(this->width(), this->height());
    QTime time = QTime::currentTime();          //当前系统时间

    //-------------------------------------------------------------------------
    QPainter painter(this);
    painter.translate(this->width() / 2, this->height() / 2);
                                                //原点
    painter.setRenderHint(QPainter::Antialiasing);
                                                //反锯齿,好看点
    painter.scale(side / 200.0, side / 200.0);  //伸缩

    //-------------------------------------------------------------------------
    painter.setPen(Qt::NoPen);                  //设置画笔
    painter.setBrush(QColor(0, 0, 0));          //设置画刷(黑色)
    painter.drawEllipse(-100, -100, 200, 200);  //画圆(表盘外圆)
    painter.setBrush(QColor(255, 255, 255));    //设置画刷(白色)
    painter.drawEllipse(-99, -99, 198, 198);    //画圆(表盘内圆)

    //-------------------------------------------------------------------------
    // 显示提示信息: "press ESC to exit!"
    //-------------------------------------------------------------------------
    QColor escColor(0, 0, 0);                   //黑色
    painter.setPen(escColor);                   //设置画笔
    painter.rotate(0.0);                        //顺时针旋转角度(0°)
    QFont font("宋体", 8, QFont::Normal, false);
    //使用字体
    painter.setFont(font);

    QString escText = "";
    //"press ESC to exit!"
    if(clockTick % 2)
    {
        escText = tr("press ESC to exit!");
    }

    painter.drawText(
        QRectF(-100, -40, 200, 40),             //画文本的矩形区域
        Qt::AlignHCenter,                       //文本的对齐方式(水平居中)
        escText                                 //文本的内容
        );

    //-------------------------------------------------------------------------
    QFont oldfont("宋体", 10, QFont::Normal, false);
    //使用字体
    painter.setFont(oldfont);

    /******************** 时钟 ********************/
    painter.setPen(Qt::NoPen);                  //设置画笔
    painter.setBrush(hourColor);                //设置画刷
    painter.save();
    painter.rotate((time.hour() * 30.0) + (time.minute() * (30.0 / 60)));
                                                //顺时针旋转角度(时角度+分角度)
    painter.drawConvexPolygon(hourHand, sizeof(hourHand) / sizeof(QPoint));
                                                //描画的形状
    painter.restore();

    //-------------------------------------------------------------------------
    // 表盘(时)
    //-------------------------------------------------------------------------
    painter.setPen(hourColor);                  //设置画笔
    for(int i = 0; i < 12; i++)                 //描画刻度
    {
        painter.rotate(30.0);                   //顺时针旋转角度(360°/12=30°)

        //1,2,4,5,7,8,10,11
        if(0 != ((i + 1) % 3))
        {
            QFont font("宋体", 10, QFont::Normal, false);
            //使用字体
            painter.setFont(font);

            painter.drawLine(QPointF(80, 0), QPointF(90, 0));   //刻度(时)
            painter.drawText(
                QRectF(-20, -78, 40, 40),           //画文本的矩形区域
                Qt::AlignHCenter | Qt::AlignTop,    //文本的对齐方式
                QString::number(i + 1)              //文本的内容
                );
        }
        //3,6,9,12
        else
        {
            QFont font("宋体", 14, QFont::Bold, false);
            //使用字体
            painter.setFont(font);

            painter.drawLine(QPointF(75, 0), QPointF(90, 0));   //刻度(时)
            painter.drawText(
                QRectF(-20, -73, 40, 40),           //画文本的矩形区域
                Qt::AlignHCenter | Qt::AlignTop,    //文本的对齐方式
                QString::number(i + 1)              //文本的内容
                );
        }
    }

    //-------------------------------------------------------------------------
    QFont newfont("宋体", 10, QFont::Normal, false);
    //使用字体
    painter.setFont(newfont);

    /******************** 分钟 ********************/
    painter.setPen(Qt::NoPen);                  //设置画笔
    painter.setBrush(minuteColor);              //设置画刷
    painter.save();
    painter.rotate((time.minute() * 6.0) + (time.second() * (6.0 / 60)));
                                                //顺时针旋转角度(分角度)
    painter.drawConvexPolygon(minuteHand, sizeof(minuteHand) / sizeof(QPoint));
                                                //描画的形状
    painter.restore();

    //-------------------------------------------------------------------------
    // 表盘(分)
    //-------------------------------------------------------------------------
    painter.setPen(minuteColor);                //设置画笔
    for(int i = 0; i < 60; i++)                 //描画刻度
    {
        if(0 != (i % 5))                        //跳过时刻度
            painter.drawLine(QPointF(82, 0), QPointF(87, 0));   //刻度(分)

        painter.rotate(6.0);                    //顺时针旋转角度(360°/60=6°)
    }

    /******************** 秒钟 ********************/
    painter.setPen(Qt::NoPen);                  //设置画笔
    painter.setBrush(secondColor);              //设置画刷
    painter.save();
    painter.rotate(6.0 * time.second());        //顺时针旋转角度(秒角度)
    painter.drawConvexPolygon(secondHand, sizeof(secondHand) / sizeof(QPoint));
                                                //描画的形状
    painter.restore();
}

// 键盘事件(由系统自动调用)
void Clock::keyPressEvent(QKeyEvent *event)
{
    switch (event->key())
    {
        case Qt::Key_Escape:
            Clock::close();
            break;

        default:
            break;
    }
}


main.cpp
 
 
 
 
#include "clock.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Clock w;
    // 禁止窗口最大化
    w.setWindowFlags(w.windowFlags() &~ (Qt::WindowMaximizeButtonHint));
    // 显示窗口
    w.show();
    
    return a.exec();
}

 
 
3. 完整的工程文件: 
3.1 项目工程文件源码: Clock_source_V1.0.0.rar
 
 
3.2 可执行程序: Clock release V1.0.0.rar
 
 


4. 运行界面如下:


猜你喜欢

转载自blog.csdn.net/xsbh0310/article/details/53929597