Qt的时钟Example

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

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

运行截图:



MyClock.pro文件:

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

digitalclock.h文件:

#ifndef DIGITALCLOCK_H
#define DIGITALCLOCK_H

#include <QLCDNumber>

class DigitalClock : public QLCDNumber
{
    //对于具有signal,slot机制的类需要声明
    Q_OBJECT

public:
    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_OBJECT

public:
    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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值