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
qt下的时钟程序(简单美丽,继承自QWidget的Clock,用timer调用update刷新,然后使用paintEvent作画就行了,超详细中文注释)good的更多相关文章
- QT学习 之 对话框 (四) 字体对话框、消息对话框、文件对话框、进程对话框(超详细中文注释)
QMessageBox类: 含有Question消息框.Information消息框.Warning消息框和Critical消息框等 通常有两种方式可以来创建标准消息对话框: 一种是采用“基于属性”的 ...
- Linux下db2V10.5命令行安装超详细图文教程(附下载地址)
下载地址:https://pan.baidu.com/s/1GtF03x1FMF3IsGdSiBJu-g 提取码:8vfj 失效了发邮件:wells974@163.com 一.db2prereqche ...
- 在使用Arduino中遇到的问题(无法使用中文注释、程序无法下载)
在使用Arduino中遇到的问题: 在用arduino给蓝牙模块供电时,下载程序是下不进去的.即使显示下进去了,其实也是没下进去. 解决方法:拔掉蓝牙模块再下程序,或给蓝牙供电的线上加上一个开关. 在 ...
- QT下UDP套接字通信——QUdpSocket 简单使用
QT下UDP套接字通信--QUdpSocket QUdpSocket类提供一个UDP套接字. UDP(用户数据报协议)是一种轻量级.不可靠.面向数据报.无连接的协议.它可以在可靠性不重要的情况下使用. ...
- Qt编写串口通信程序全程图文解说
(说明:我们的编程环境是windows xp下,在Qt Creator中进行,假设在Linux下或直接用源代码编写,程序稍有不同,请自己修改.) 在Qt中并没有特定的串口控制类,如今大部分人使用的是第 ...
- 转:Qt编写串口通信程序全程图文讲解
转载:http://blog.csdn.net/yafeilinux/article/details/4717706 作者:yafeilinux (说明:我们的编程环境是windows xp下,在Q ...
- Qt简单项目--加法计算器(详细代码注释)
Qt的简单案例--加法计算器(详细代码注释) 一.项目结构 二.项目代码 widget.h #ifndef WIDGET_H #define WIDGET_H //预编译指令, 为了避免头文件被重复包 ...
- Qt编写串口通信程序全程图文讲解 .
在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们可以去 http://sourceforge.net/projects/qex ...
- 【转】Qt编写串口通信程序全程图文讲解
本文章原创于www.yafeilinux.com 转载请注明出处. (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自 ...
随机推荐
- Git恢复删除或修改的文件 ls-files
一.git ls-files -d 查看删除了的文件 1.查看当前状态可以看到删除了一个index.js: git status image.png 2.查看当前项目中删除了的文件 git ls-fi ...
- php课程 4-14 数组如何定义使用
php课程 4-14 数组如何定义使用 一.总结 1.各种语言键值对取值和赋值赋值表达式左边的特点是什么? 键值对,用于取值和赋值,取值和赋值的左边都是一样的 2.各种语言键值对取值或者赋值的时候如 ...
- TensorFlow 学习(十二)—— 高级函数
tf.map_fn(fn, elems):接受一个函数对象,然后用该函数对象对集合(elems)中的每一个元素分别处理, def preprocessing_image(image, training ...
- 网络编程C#
C#网络程序设计(1)网络编程常识与C#常用特性 网络程序设计能够帮我们了解联网应用的底层通信原理! (1)网络编程常识: 1)什么是网络编程 只有主要实现进程(线程)相互通信和基本的 ...
- 【a603】加工生产调度
Time Limit: 1 second Memory Limit: 32 MB [问题描述] 某工厂收到了n个产品的订单,这n个产品分别在A.B两个车间加工,并且必须先在A车间加工后才可以到B车间加 ...
- hadoop 3.x Replication与Availability不一致
看下面的文字前先确保你的Replication值不大于你设置的虚拟机数量 如图,显示的副本数为3,但是实际可用的只有一台机器,查看了下hadoop003,hadoop004两台机器,果然没有存储数据, ...
- 经典卷积神经网络的学习(二)—— VGGNet
1. 简介 VGGNet 是牛津大学计算机视觉组(Visual Geometry Group)和 Google DeepMind 公司的研究员一起研发的深度卷积神经网络,其主要探索了卷积神经网络的深度 ...
- DevCloud项目管理与Leangoo使用对比
DevCloud(华为软件开发云)是集华为研发实践.前沿研发理念.先进研发工具为一体的研发云平台,面向开发者提供端到端的研发工具服务.项目管理是DevCloud服务之一,致力于为敏捷开发团队提供简单高 ...
- 同一性(identical)
f(x)=x,表明 f(⋅) 为同一函数. A 与 B 具有 360° 的区别 A 向左转,再向右转 ⇒ A A 向左转,向左转,向后转 ⇒ A
- PCI GXL学习之二次开发篇
作者:朱金灿 来源:http://blog.csdn.net/clever101 gxl的二次开发分初级和高级之分.初级是gxl提供了几百个模块供你编排成不同的作业.高级就是你可以编写你的算法模块,然 ...