最近,小朋友开始学习认识时钟,看看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();
}
编译运行,如题头的运行效果。