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

Qt中时钟时间功能QTime详解

2009-11-23 14:58 176 查看
QTime提供了时钟时间功能,记录从午夜开始的时、分、秒、毫秒数,并提供比较和操作时间的功能。下面结合源码介绍QTime类,为便于理解QTime的实现,下面代码均做适当的简化。

在QTime内部用一个int型私有变量mds来记录时间信息,即将时间转换为毫秒数来保存。QTime有两个构造函数,默认的无参构造函数为QTime() : mds(NullTime){},将mds置为NullTime,以标志为该对象在进一步设置时间前(setHMS())为空对象,而NullTime为QTime的一个私有枚举变量enum{NullTime = -1},所有QTime内部使用mds是否被置为-1来标志对象是否为空对象,并且可以用isNull()函数可以检查当前对象是否为空对象。而另一个参数构造函数为:

QTime(int h, int m, int s, int ms){ setHMS(h, m, s, ms); }

也就是进一步调用了时间的设置函数setHMS(),而所谓的时间设置函数其实很简单,就是将参数时、分、秒、毫秒均转换为毫秒表示,对于一天来说,也就24个小时,所以以毫秒表示,最大的数字也就是86400000。

bool setHMS(int h, int m, int s, int ms){

//检查参数(略)

mds = (h*SECS_PER_HOUR + M*SECS_PER_MIN + S)*1000 + ms;

return true;

}

SECS_PER_HOUR-3600,SECS_PER_MIN-60,这两个宏应该很显然。setHMS()必须接受合格的参数,否则不会定义得到有效的时间对象,可以用isValid()函数检查该对象的有效性。作为私有变量mds,还有一个私有成员ds(),它的功能就是返回mds的值,但是它在返回前做了一个小小的判断,即如果mds为空的话,它不返回-1(NullTime),而是返回0。

当然,有了mds的毫秒形式记录的时间,我们很容易换算出时、分、秒、毫秒各自的数值,也就是当我们显式的调用hour(), minute(), second(), msec()时都由mds做了进一步的换算。既然统一都用毫秒数来表示,那所有的时间比较操作符就很容易理解了,纯粹是两个int型大小之间的比较。

QTime有几个静态函数,currentTime()可以用当前时间来定义一个时钟时间对象,fromString()可以根据一个字符串定义一个时钟时间对象。

另外介绍一下start(), restart(), elapsed()方法:

void QTime::start(){ *this = currentTime(); } //调用start时即将该对象的时间更新为当前时间

int QTime::restart()

{

QTime t = currentTime();

int n = msecsTo(t);

if (n < 0) //如果穿过午夜,即增加24小时86100000毫秒( passed midnight)

n += 86400*1000;

*this = t;

return n;

}

int QTime::elapsed() const

{

int n = msecsTo(currentTime());

if (n < 0) // passed midnight

n += 86400 * 1000;

return n;

}

elapsed()所做的事情就是返回自上次start()或者restart()之后已经有多少毫秒飘过去了,这里进行了简单的比较,如果现在的时间(毫秒形式)比以前的小,说明肯定穿过一个午夜了,那就加上一个24小时即86400*1000毫秒,那穿过两个午夜怎办,抱歉,只管一个午夜。而restart() 返回的和elapsed()返回的东西是一样的,但还做了start()的事情,即更新该时间对象存储的时间毫秒数,类似于常用电子表上计时器的分圈计时效果。

应该来说,QTime是一个很简单的时钟时间类,提供的方法也较为基础,当然同时也很有效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: