目录
1、定时器
2、计时器
2.1 QTime 时间转换成字符串函数
3、QT 获取日期,时间,星期
4、综合应用
定时器是用来处理周期性事件的一种对象,类似于硬件定时器。例如设置一个定时器的定时周期为 1000 毫 秒,那么每 1000 毫秒就会发射定时器的 timeout() 信号,在信号关联的槽函数里就可以做相应的处理。
1、定时器
使用 QTimer 定时器类。使用过程:
1
、 首先创建一个定时器类的对象 QTimer *timer = new QTimer(this);
2
、
timer
超时后会发出
timeout()
信号,所以在创建好定时器对象后给其建立信号与槽 connect(timer, SIGNAL(timeout()), this, SLOT(onTimeout()));
3
、 在需要开启定时器的地方调用 void QTimer::start ( int msec ); 这个 start
函数参数也是毫秒级别; timer->start(msec );
4
、 在自己的超时槽函数里面做超时处理。
例如:
#ifndef _MYTIMER_H
#define _MYTIMER_H
#include <QObject>
class QTimer;
class MyTimer : public QObject
{
Q_OBJECT
public:
MyTimer(QObject* parent = NULL);
~MyTimer();
public slots:
void handleTimeout(); //超时处理函数
private:
QTimer *m_pTimer;
};
#endif //_MYTIMER_H
#include "widget.h"
#include<QDebug>
#include <QTimer>
#define TIMER_TIMEOUT (5*1000)
MyTimer::MyTimer(QObject *parent)
:QObject(parent)
{
m_pTimer = new QTimer(this);
connect(m_pTimer, SIGNAL(timeout()), this, SLOT(doTimeout()));
m_pTimer->start(TIMER_TIMEOUT);
}
MyTimer::~MyTimer()
{
}
void MyTimer::doTimeout()
{
qDebug()<<"Enter timeout processing function\n";
if(m_pTimer->isActive()){
m_pTimer->stop();
}
}
2、计时器
当
Qt
需要使用计时时
,
就可以使用
Qt
的计时类
Qtime
。
1. QTime
的计时方式主要是通过时分秒计时
2. QTime
可以转换为
HH:MM:SS
这种的数据格式
3. QTime
不会自动计时
,
需要自己手动加时间
,
时间可以是
1
秒
,
也可以是自定义的时长
4. QTime
增加时间使用的函数
2.1 QTime 时间转换成字符串函数
例如:
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QTime time = QTime::currentTime();//获取当前事件
QString strTime = time.toString("hh:mm:ss.zzz");//转换成 QString
time = QTime::fromString("02:23:45.789","hh:mm:ss.zzz");//QString 转 QTime
strTime = time.toString("hh:mm:ss.zzz");
QTime time1(7,30,5 ,100);//传递时分秒毫秒构造函数
strTime = time1.toString("hh:mm:ss.zzz");
int hour = time1.hour();//获取小时,7
qDebug()<<hour;
int minute=time1.minute();//获取分钟,30
qDebug()<<minute;
int second = time1.second();//获取秒数,5
qDebug()<<second;
int mssecond = time1.msec();//获取毫秒,100
qDebug()<<mssecond;
QTime t1 = time1.addMSecs(100);//增加 100ms
qDebug()<<t1.msec();
QTime t2 = time1.addSecs(80);//增加 80s
qDebug()<<t2.second();
if(time < time1)//比较两个 QTime,时间晚的大
qDebug()<<"time<time1";
QTime t3;
t3.start();//开始计时
Sleep(1000);
int elspsed = t3.elapsed();//计算多少 ms 过去了
t3.restart();//重新计时
int milsecond = QTime::currentTime().msecsSinceStartOfDay();//返回从零点开
始共计多少 ms
qDebug()<<milsecond;
QTime t4(22,25,10);
QTime t5(22,24,0);
qDebug()<<t4.secsTo(t5);//两者相差了多少秒,t4 到 t5 需要多少秒,如果 t5<t4,返
回负值
qDebug()<<strTime;
}
3、QT 获取日期,时间,星期
QT
类库
QT
提供
QDate
、
QTime
、
QDateTime
三个类对日期,时间等进行操作。
功能接口
QDateTime::currentDateTime()
→
获取当前日期时间,返回一个
QDateTime
对象
toString(“yyyy.MM.dd hh:mm:ss.zzz ddd”)
→
将
QDateTime
对象的日期时间,转换为
date time
标准格式。
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QDateTime current_date_time = QDateTime::currentDateTime();
qDebug()<<current_date_time;
QString current_week = current_date_time.toString("ddd");
qDebug() << "week: "<<current_week; //获取星期,“周一”,“周二”,“周三”等
等。
QString current_date = current_date_time.toString("yyyy.MM.dd hh:mm:ss.zzz
ddd"); //格式化为 QString
qDebug()<<current_date;
QTime current_time = QTime::currentTime(); //获取当前时间
qDebug()<<current_time;
int minute = current_time.minute(); //获取分钟数据,int 类型
qDebug()<<"minute : "<< minute;
int hour = current_time.hour(); //获取小时数据,int 类型
qDebug()<<"hour: "<<hour;
}
4、综合应用
Qt
中的定时器类是
QTimer
。
QTimer
不是一个可见的界面组件,在
UI
设计器的组件面板里找不到它。图 1 中的实例程序实现了一个计时器的功能,就是计算定时器开始到停止持续的时间长度,计时器是
QTime
类。
QTimer
主要的属性是
interval
,是定时中断的周期,单位毫秒。
QTimer
主要的信号是
timeout()
,在定时中断时发射此信号,要想在定时中断里做出响应,这就需要编写 timeout()
信号的槽函数。下面是窗口类中增加的 定义。
class Dialog : public QDialog
{
private:
QTimer *fTimer; //定时器
QTime fTimeCounter;//计时器
private slots:
void on_timer_timeout () ; //定时溢出处理槽函数
};
这里定义了一个定时器
fTimer
,—个计时器
fTimeCounter
。还定义了一个槽函数
on_timer_ timeout()
,作为 定时器的 timeout()
信号的响应槽函数。 需要在窗口类的构造函数里创建定时器,并进行信号与槽的关联。
Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog)
{
ui->setupUi(this);
fTimer=new QTimer(this);
fTimer->stop();
fTimer->setInterval (1000) ;//设置定时周期,单位:毫秒
connect(fTimer,SIGNAL(timeout()),this,SLOT(on_timer_timeout()));
}
槽函数
on_timer_timeout()
的实现代码如下:
void Dialog::on_timer_timeout()
{
//定时器中断响
QTime curTime=QTime::currentTime(); //获取当前时间
ui->LCDHour->display (curTime.hour()); //显示小时
ui->LCDMin->display (curTime.minute()); //显示分钟
ui->LCDSec->display(curTime.second()); //显示秒
int va=ui->progressBar->value();
va++;
if (va>100)
va=0;
ui->progressBar->setValue(va);
}
这段代码首先用
QTime
类的静态函数
Qtime::currentTime()
获取当前时间,然后用
QTime
的成员函数 hour()、
minute()
、
second()
分别获取小时、分钟、秒,并在几个
LCDNumber
组件上显不。循环更新
progressBar的值,是为了让界面有变化,表示定时器在运行。
设置定时器的周期,只需调用
Qtimer::setlnterval()
函数即可。
QTimer::start()
函数用于启动定时器,界面上的“开始”按钮代码如下:
void Dialog::on_btnStart_clicked()
{
fTimer->start () ;//定时器开始工作
fTimeCounter.start () ; //计时器开始工作
ui->btnStart->setEnabled(false);
ui->btnStop->setEnabled(true);
ui->btnSetIntv->setEnabled(false);
}
计时器
fTimeCounter
执行
start()
是将当前时间作为计时器的时间。
QTimer::Stop()
函数停止定时器,界面上的“停止”按钮可实现这一功能,其代码如下:
void Dialog::on_btnStop_clicked()
{
fTimer->stop () ; //定时器停止
int tmMsec=fTimeCounter.elapsed() ;//毫秒数
int ms=tmMsec%1000;
int sec=tmMsec/1000;
QString str=QString::asprintf ("流逝时间:%d 秒,%d 毫秒", sec, ms);
ui->LabElapsTime->setText(str);
ui->btnStart->setEnabled(true);
ui->btnStop->setEnabled(false);
ui->btnSetIntv->setEnabled(true);
}
例如: