qt下的时钟程序(简单美丽,继承自QWidget的Clock,用timer调用update刷新,然后使用paintEvent作画就行了,超详细中文注释)good

最近抽空又看了下qt,发现用它来实现一些东西真的很容易
比如下面这个例子,绘制了个圆形的时钟,
但代码却清晰易懂[例子源自奇趣科技提供的例子]
因为清晰,所以就只写注释了,吼吼
其实也就这么几行代码
头文件


//clock.h

#ifndef CLOCK_H
#define CLOCK_H

#include <QWidget>

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

public:
    Clock(QWidget *parent = 0);

protected:
//重绘用的事件处理函式
    void paintEvent(QPaintEvent *event);
};

#endif // CLOCK_H

cpp文件


  1 #include "clock.h"
  2 
  3 
  4 #include <QtGui>
  5 
  6 #include "clock.h"
  7 
  8 Clock::Clock(QWidget *parent): QWidget(parent)
  9 {
 10 //声明一个定时器
 11     QTimer *timer = new QTimer(this);
 12 //连接信号与槽
 13     connect(timer, SIGNAL(timeout()), this, SLOT(update()));
 14     timer->start(1000);
 15 //设置窗体名称与大小
 16     setWindowTitle(tr("Clock"));
 17     resize(200, 200);
 18 
 19 }
 20 
 21 
 22 void Clock::paintEvent(QPaintEvent *)
 23 
 24 {
 25 //下面三个数组用来定义表针的三个顶点,以便后面的填充
 26     static const QPoint hourHand[3] = {
 27         QPoint(3, 8),
 28         QPoint(-3, 8),
 29         QPoint(0, -40)
 30     };
 31     static const QPoint minuteHand[3] = {
 32         QPoint(3, 8),
 33         QPoint(-3, 8),
 34         QPoint(0, -70)
 35     };
 36     static const QPoint secondHand[3] = {
 37         QPoint(3, 8),
 38         QPoint(-3, 8),
 39         QPoint(0, -90)
 40     };
 41 
 42 //填充表针的颜色
 43     QColor hourColor(127, 0, 127);
 44     QColor minuteColor(0, 127, 127, 191);
 45     QColor secondColor(127, 127,0,120);
 46 //绘制的范围
 47     int side = qMin(width(), height());
 48 //获取当前的时间
 49     QTime time = QTime::currentTime();
 50 //声明用来绘图用的“画家”
 51     QPainter painter(this);
 52 
 53     painter.setRenderHint(QPainter::Antialiasing);
 54 //重新定位坐标起始点点
 55     painter.translate(width() / 2, height() / 2);
 56 //设定花布的边界
 57     painter.scale(side / 200.0, side / 200.0);
 58 //填充时针,不需要边线所以NoPen
 59     painter.setPen(Qt::NoPen);
 60 //画刷颜色设定
 61     painter.setBrush(hourColor);
 62 //保存“画家”的状态   
 63     painter.save();
 64 //将“画家”(的”视角“)根据时间参数转移
 65     painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));
 66 //填充时针的区域
 67     painter.drawConvexPolygon(hourHand, 3);
 68 //恢复填充前“画家”的状态    
 69     painter.restore();
 70 
 71 //下面画表示小时的刻度,此时要用到画笔(因为要划线)
 72     painter.setPen(hourColor);
 73 //十二个刻度,循环下就好了
 74     for (int i = 0; i < 12; ++i) {
 75 //没次都是这样,先画跳线,再转个角 
 76        painter.drawLine(88, 0, 96, 0);
 77         painter.rotate(30.0);
 78     }
 79 
 80 //后面的跟前面的类似,分别绘制了分针和秒针,及相应的刻度,我就不废话了
 81 
 82     painter.setPen(Qt::NoPen);
 83 
 84     painter.setBrush(minuteColor);
 85 
 86 
 87     painter.save();
 88     painter.rotate(6.0 * (time.minute() + time.second() / 60.0));
 89     painter.drawConvexPolygon(minuteHand, 3);
 90     painter.restore();
 91 
 92     painter.setPen(minuteColor);
 93 
 94     for (int j = 0; j < 60; ++j) {
 95         if ((j % 5) != 0)
 96             painter.drawLine(92, 0, 96, 0);
 97         painter.rotate(6.0);
 98     }
 99 
100 
101     painter.setPen(Qt::NoPen);
102 
103     painter.setBrush(secondColor);
104 
105     painter.save();
106     painter.rotate(6.0*time.second());
107     painter.drawConvexPolygon(secondHand,3);
108     painter.restore();
109 
110 }
111 
112

main文件


#include <QApplication>

#include "clock.h"

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

pro文件

HEADERS       = clock.h
SOURCES       = clock.cpp \
                main.cpp

下面是运行时的截图,开发环境为qtcreator

在奇趣提供的例子中还将其做成了控件,有时间在写点关于那个例子的东西。

http://www.cnblogs.com/pingf/archive/2009/08/06/1540374.html

时间: 2024-10-05 23:58:28

qt下的时钟程序(简单美丽,继承自QWidget的Clock,用timer调用update刷新,然后使用paintEvent作画就行了,超详细中文注释)good的相关文章

QT学习 之 对话框 (四) 字体对话框、消息对话框、文件对话框、进程对话框(超详细中文注释)

QMessageBox类: 含有Question消息框.Information消息框.Warning消息框和Critical消息框等 通常有两种方式可以来创建标准消息对话框: 一种是采用“基于属性”的API,一种是使用QMessageBox的静态方法. 后者书写容易,但缺少灵活性,针对用户给出的提示的信息不够丰富,并且不能自定义消息对话框里面的按钮提示信息.因此推荐第一种写法. [cpp] view plaincopy <span style="font-size:18px;"&

WinForm学习 --简单的模拟时钟程序

今天学习GDI+,试着想写一个模拟时钟的小程序,原以为很简单实现:但其实还有些复杂,特别是利用三角函数的那部分,让我四处找资料恶补了一下高中数学才算弄清楚,现在就回顾一下这个程序吧. 程序的目的是要模拟出时钟的效果,那首先就是要画出这个时钟的样子.不考虑美观,一个时钟最简单的组成是一个圆形的表盘,三根直线代表的时针.分针和秒针. <img缺失> 看起来很简单吧,但要怎么样画呢?让我们一步一步来吧: 1.画表盘 Graphics g = this.CreateGraphics(); //创建一个

转:Qt编写串口通信程序全程图文讲解

转载:http://blog.csdn.net/yafeilinux/article/details/4717706  作者:yafeilinux (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自己改动.) 在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们可以去 http://sourceforge.net/projects/qextser

QT 下opengl (认识)

虽然Qt不以效率著称,但是事实上有足够的优化,最最典型的就是默认的图形双缓冲,按照Windows下的编程惯例是需要手动开启,并通过额外的接口调用才能使用的,这一点在以前简单图形编程学习时比较过Qt,Win32 GDI时感受特别深刻,在没有额外处理的时候,Win32动画程序那个闪阿,而Qt程序非常稳定.事实上,我想,Qt的其他问题比效率严重多了,比如个人感觉Qt程序在Windows下刷新的感知明显没有Windows原生程序快,这点倒是值得改进.OpenGL只处理与3D图形的绘制,基本上不提供创建用

Qt编写串口通信程序全程图文解说

(说明:我们的编程环境是windows xp下,在Qt Creator中进行,假设在Linux下或直接用源代码编写,程序稍有不同,请自己修改.) 在Qt中并没有特定的串口控制类,如今大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们能够去 http://sourceforge.net/projects/qextserialport/files/ 进行下载,也能够去下载我上传到网上的: http://download.csdn.net/source/176278

用 Qt Creator 开发非 Qt 的 C/C++ 程序

在Windows还是习惯用VS2005但是现在到了Linux下,开发起来C/C++程序就没有那么得心应手的IDE了.虽然很多人推荐E开头那个主要作为Java开发的IDE,不过安上插件后感觉不大好,一个是那个智能完成功能反应有点迟钝,对标准库的支持 不大好,另一个是编译起来还是麻烦,不能自动根据工程生成合适的makefile(或者是我没发现这个功能哈,一直用它的同志们不要笑我土) 发掘了半天--发现一个Monkey IDE,用了一下,感觉用起来不大方便,也是用来写Qt程序的,但是不如QtCreat

VC++或QT下 高精度 多媒体定时器

在VC编程中,用SetTimer可以定义一个定时器,到时间了,就响应OnTimer消息,但这种定时器精度太低了.如果需要精度更高一些的定时器(精 确到1ms),可以使用下面的高精度多媒体定时器进行代码优化,可以达到毫秒级的精度,而且使用方便.先要包含头文件"mmsystem.h"和库文 件"winmm.lib". 虽然Win95下可视化开发工具如VC.Delphi.C++   Builder等都有专用的定时器控件Timer,而且使用很方便,可以实现一定的定时功能,但

QT中关闭应用程序和窗口的函数(quit(),exit()以及close()的区别)

使用QT编辑界面,其中带来很大方便的一点就是Qt中自带丰富的.种类齐全的类及其功能函数,程序员可以在编辑程序的过程中简单地直接调用.关于窗口关闭的操作,在这里指出常用的三个槽,即quit(),exit()以及close().    首先说明窗口退出时,系统提示对话框的代码编辑.对主程序的退出,可以调用成员函数exit(),同时也可以调用槽quit(),二者此时都能起到关闭应用程序的作用.只是应注意二者调用的方式不同.如下程序示例:        {         QApplication* a

Qt下libusb-win32的使用方法(转)

源:Qt下libusb-win32的使用方法 之前一直找不到适合WIN7下的Tiny6410的USB下载软件,正好这几天开始学习USB,所以打算自己写一个专门用于Tiny6410的WIN7下的USB下载软件. 发现了libusb这个库可以用作无驱USB开发,就是说根本不需要了解Window驱动开发的知识就可以开发USB设备驱动,只需要了解一下USB的相关协议即可.Windows下我几乎不用VS来写程序,或者说我不懂MFC吧,呵呵,所示我用Qt来做界面.好了,进入正题. 首先下载libusb-wi