您的位置:首页 > 编程语言 > Qt开发

Qt的时钟Example

2015-11-28 00:52 507 查看
最近,小朋友开始学习认识时钟,看看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();
}


编译运行,如题头的运行效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: