Qt的时钟Example

来源:互联网 发布:微信支付java案例demo 编辑:程序博客网 时间:2024/06/09 15:43

最近,小朋友开始学习认识时钟,看看Qt下刚好有个时钟的例子,翻出来温故而知新。

浏览了传统时钟和数字时钟的代码,都是很清晰、易懂。
我把两个例子程序整合在一起,在给传统时钟加上数字,方便小朋友认识时钟。

运行截图:



MyClock.pro文件:

HEADERS       = analogclock.h \                digitalclock.hSOURCES       = analogclock.cpp \                digitalclock.cpp                main.cpp

digitalclock.h文件:

#ifndef DIGITALCLOCK_H#define DIGITALCLOCK_H#include <QLCDNumber>class DigitalClock : public QLCDNumber{    //对于具有signal,slot机制的类需要声明    Q_OBJECTpublic:    DigitalClock(QWidget *parent = 0);private slots:    void showTime();};#endif

digitalclock.cpp文件:

#include <QtGui>#include "digitalclock.h"DigitalClock::DigitalClock(QWidget *parent)    : QLCDNumber(parent){    setSegmentStyle(Filled);    QTimer *timer = new QTimer(this);    connect(timer, SIGNAL(timeout()), this, SLOT(showTime()));    timer->start(1000);    showTime();    //setWindowTitle(tr("Digital Clock"));    resize(150, 60);}void DigitalClock::showTime(){    QTime time = QTime::currentTime();    QString text = time.toString("hh:mm");    if ((time.second() % 2) == 0)        text[2] = ' ';    display(text);}

analogclock.h文件:

#ifndef ANALOGCLOCK_H#define ANALOGCLOCK_H#include <QWidget>class AnalogClock : public QWidget{    //对于具有signal,slot机制的类需要声明    Q_OBJECTpublic:    AnalogClock(QWidget *parent = 0);protected:    //重绘用的事件处理函式    void paintEvent(QPaintEvent *event);};#endif

analogclock.cpp文件:

#include <QtGui>#include "analogclock.h"AnalogClock::AnalogClock(QWidget *parent)    : QWidget(parent){    //声明一个定时器    QTimer *timer = new QTimer(this);    //连接信号与槽    connect(timer, SIGNAL(timeout()), this, SLOT(update()));    timer->start(1000);    // ...    QFont font;    font.setPointSize(10);//字体大小设置为10    setFont(font);    //设置窗体名称与大小    setWindowTitle(tr("时钟"));    resize(600, 500);}void AnalogClock::paintEvent(QPaintEvent *){    //下面三个数组用来定义表针的三个顶点,以便后面的填充    static const QPoint hourHand[4] = {        QPoint(6, 8),        QPoint(0, 16),        QPoint(-6, 8),        QPoint(0, -40)    };    static const QPoint minuteHand[4] = {        QPoint(5, 8),        QPoint(0, 16),        QPoint(-5, 8),        QPoint(0, -65)    };    static const QPoint secondHand[4] = {        QPoint(2, 8),        QPoint(0, 16),        QPoint(-2, 8),        QPoint(0, -80)    };    //填充表针的颜色    QColor hourColor(127, 0, 127);    QColor minuteColor(0, 127, 127, 191);    QColor secondColor(127, 127, 0, 120);    //绘制的范围    int side = qMin(width(), height());    //获取当前的时间    QTime time = QTime::currentTime();    //声明用来绘图用的“画家”    QPainter painter(this);    painter.setRenderHint(QPainter::Antialiasing);    //重新定位坐标起始点点    painter.translate(width() / 2, height() / 2);    //设定花布的边界    painter.scale(side / 200.0, side / 200.0);    //填充时针,不需要边线所以NoPen    painter.setPen(Qt::NoPen);    //画刷颜色设定    painter.setBrush(hourColor);    //保存“画家”的状态    painter.save();    //将“画家”(的”视角“)根据时间参数转移    painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));    //填充时针的区域    painter.drawConvexPolygon(hourHand, 4);    //恢复填充前“画家”的状态    painter.restore();    //下面画表示小时的刻度,此时要用到画笔(因为要划线)    painter.setPen(hourColor);    //十二个刻度,循环下就好了    for (int i = 0; i < 12; ++i) {        //没次都是这样,先画跳线,再转个角        painter.drawLine(88, 0, 96, 0);        painter.rotate(30.0);        painter.drawText(-20, -82, 40, 40,                                  Qt::AlignHCenter | Qt::AlignTop,                                  QString::number(i+1));    }    //后面的跟前面的类似,分别绘制了分针和秒针,及相应的刻度,我就不废话了    painter.setPen(Qt::NoPen);    painter.setBrush(minuteColor);    painter.save();    painter.rotate(6.0 * (time.minute() + time.second() / 60.0));    painter.drawConvexPolygon(minuteHand, 4);    painter.restore();    painter.setPen(minuteColor);    for (int j = 0; j < 60; ++j) {        if ((j % 5) != 0)            painter.drawLine(92, 0, 96, 0);                    painter.rotate(6.0);    }    painter.setPen(Qt::NoPen);    painter.setBrush(secondColor);    painter.save();    painter.rotate(6.0 * time.second());    painter.drawConvexPolygon(secondHand, 4);    painter.restore();}

main.cpp文件:

#include <QApplication>#include <qtextcodec.h>#include "analogclock.h"#include "digitalclock.h"int main(int argc, char *argv[]){    QApplication app(argc, argv);    QTextCodec *codec = QTextCodec::codecForName("utf8");    QTextCodec::setCodecForTr(codec);    QTextCodec::setCodecForLocale(codec);    QTextCodec::setCodecForCStrings(codec);    AnalogClock aclock;    DigitalClock dclock(&aclock);#if defined(Q_OS_SYMBIAN)    aclock.showMaximized();#else    aclock.show();#endif    return app.exec();}

编译运行,如题头的运行效果。


0 0