Qt 编写时钟程序


下面就来看看用Qt如何编写一个时钟吧.

第一步编写一个头文件。

//********mainwindow.h**********//

#ifndef MainWindow_H

#define MainWindow_H
#include <QWidget>
class Clock : public QWidget
{
     Q_OBJECT	public:
     Clock(QWidget *parent = 0);
protected:
    void paintEvent(QPaintEvent *event);
};
#endif // MainWindow_H

//********END END END END**********//

//由于具有signal,slot机制的类,所以在此需要声明Q_OBJECT
//重绘用的事件处理函式void paintEvent(QPaintEvent *event);
 
//********mainwindow.cpp**********//
#include <QtGui>
 #include "mainwindow.h"
 Clock::Clock(QWidget *parent): QWidget(parent)
 {
 //声明一个定时器
 QTimer *timer = new QTimer(this);
 //连接信号与槽
 connect(timer, SIGNAL(timeout()), this, SLOT(update()));
 timer->start(1000); //注意单位,1000代表的是毫秒,所以表示每秒刷新一次
 //设置窗体名称与大小
 setWindowTitle(tr("Clock"));
 resize(400,400);
 }
 void Clock::paintEvent(QPaintEvent *)
 {
 //下面三个数组用来定义表针的三个顶点,以便后面的填充
 static const QPoint hourHand[3] = {
 QPoint(5, 14),
 QPoint(-5, 14),
 QPoint(0, -50)
 };
 static const QPoint minuteHand[3] = {
 QPoint(5, 14),
 QPoint(-5,14),
 QPoint(0, -70)
 };
 static const QPoint secondHand[3] = {
 QPoint(5, 14),
 QPoint(-5, 14),
 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);
 //填充时针,不需要设定边线则用如下代码
 //painter.setPen(Qt::NoPen);
//填充时针,需要设定边线则用如下代码,边线为红色
 painter.setPen( Qt::red );
 //画刷颜色设定
 painter.setBrush(hourColor);
 //保存状态
 painter.save();
 painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));//坐标轴旋转的角度
 //填充时针的区域
 painter.drawConvexPolygon(hourHand, 3);//根据三个坐标点绘图
 //恢复填充前的状态
 painter.restore();
 //下面画表示小时的刻度
 painter.setPen(Qt::red);
 //十二个刻度,循环下就好了
 for (int i = 0; i < 12; ++i) {
 //没次都是这样,先画跳线,再转个角
 painter.drawLine(80, 0, 100, 0);
 painter.rotate(30.0);
 }
 //以下代码和上面的类似,可对应起来参考理解
 painter.setPen(Qt::blue);
 painter.setBrush(minuteColor);
 painter.save();
 painter.rotate(6.0 * (time.minute() + time.second() / 60.0));
 painter.drawConvexPolygon(minuteHand, 3);
 painter.restore();
 painter.setPen(minuteColor);
 for (int j = 0; j < 60; ++j) {
 if ((j % 5) != 0)
 painter.drawLine(90, 0, 100, 0);
 painter.rotate(6.0);
 }
 painter.setPen(Qt::black);
 painter.setBrush(secondColor);
 painter.save();
 painter.rotate(6.0*time.second());
 painter.drawConvexPolygon(secondHand,3);
 painter.restore();
 }
//********END END END END**********//
 

//********main.cpp**********//

#include <QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
     QApplication app(argc, argv);
//声明下,再show出来就可以了
     Clock clock;
     clock.show();
    return app.exec();
}

//********END END END END**********//

到此为止就大功告成了,如有疑问可留言与本人联系,欢迎共同学习交流。

相关内容