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是一个很简单的时钟时间类,提供的方法也较为基础,当然同时也很有效。
在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是一个很简单的时钟时间类,提供的方法也较为基础,当然同时也很有效。
相关文章推荐
- Qt时钟界面、数字时钟(12小时制24小时制切换、修改系统时间)
- [置顶] javascript时间和日期,实现时钟功能之浅析
- Qt实现屏保功能,鼠标一定时间无响应程序进入待机状态
- 利用INT 1Ah时钟中断来实现任意时间的自动开机功能
- QT4实现信号灯随时间变化颜色的功能
- 禁用virtual box的时间同步功能(检测到时钟错误)
- QT时间触发电子时钟
- 使用jQuery方法获取当前日期和时间!(时钟显示功能)
- javascript时间和日期,实现时钟功能
- Qt实现屏保功能,鼠标一定时间无响应程序进入待机状态
- TextView显示系统时间(时钟功能带秒针变化
- 在编辑框中动态显示当前时间,实现时钟功能
- Qt实现屏保功能,鼠标一定时间无响应程序进入待机状态
- Qt时钟界面、数字时钟(12小时制24小时制切换、修改系统时间)
- linux系统时间和硬件时钟问题(date和hwclock)
- Qt如何实现QTableView的撤消与恢复功能
- [Linux文件]查询时间实现秒定时功能
- jsp中以服务器时间作为起始,显示时钟的小程序
- QT暂未用到的功能
- Qt中切换窗口功能的实现