嵌入式 QT 定时器与计时器

简介: 嵌入式 QT 定时器与计时器

定时器是用来处理周期性事件的一种对象,类似于硬件定时器。例如设置一个定时器的定时周期为 1000 毫 秒,那么每 1000 毫秒就会发射定时器的 timeout() 信号,在信号关联的槽函数里就可以做相应的处理。

1、定时器

 使用 QTimer 定时器类。使用过程:

1、 首先创建一个定时器类的对象 QTimer *timer = new QTimer(this);

2timer 超时后会发出 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 提供 QDateQTimeQDateTime 三个类对日期,时间等进行操作。

功能接口

  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 中的定时器类是 QTimerQTimer 不是一个可见的界面组件,在 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);
}

例如:

 

相关文章
|
7月前
|
开发框架 Linux C语言
C、C++、boost、Qt在嵌入式系统开发中的使用
C、C++、boost、Qt在嵌入式系统开发中的使用
226 1
|
7月前
【qt】日历和定时器
【qt】日历和定时器
80 0
|
6月前
Qt定时器
Qt定时器
|
5月前
|
机器学习/深度学习 人工智能 计算机视觉
好的资源-----打卡机+Arm+Qt+OpenCV嵌入式项目-基于人脸识别的考勤系统-----B站神经网络与深度学习,商城
好的资源-----打卡机+Arm+Qt+OpenCV嵌入式项目-基于人脸识别的考勤系统-----B站神经网络与深度学习,商城
|
6月前
|
API
【Qt】Qt定时器类QTimer
【Qt】Qt定时器类QTimer
|
编译器
嵌入式QT 树形浏览 - navListView
嵌入式QT 树形浏览 - navListView
|
7月前
|
测试技术 开发者 C++
【Qt 职业生涯规划】Qt 开发者的多元宇宙:从桌面到嵌入式,从2D到3D,你适合哪条路?
【Qt 职业生涯规划】Qt 开发者的多元宇宙:从桌面到嵌入式,从2D到3D,你适合哪条路?
445 1
|
7月前
|
Linux 图形学
深入理解Qt定时器:QTimer的魅力与挑战(一)
深入理解Qt定时器:QTimer的魅力与挑战
4382 0
|
7月前
|
C++
QT定时器的使用timer示例
QT定时器的使用timer示例
|
7月前
|
安全 API 开发者
深入理解Qt定时器:QTimer的魅力与挑战(二)
深入理解Qt定时器:QTimer的魅力与挑战
485 0