因为QT写出来一般都是一个应用,写代码的时候也是写很多的功能函数,执行功能函数时采用的是信号与槽(当获得信号时执行槽函数)。
所以它与像单片机的代码想比,不能直接在主函数里写个while来让程序不断调用某些指令,QT调用函数的过程更像是单片机里的中断。
所以这也导致如果我们想循环执行某些指令时,无法直接在主函数里写一个循环(容易让程序卡死),这时更好的选择是利用QT的定时器,每隔一段时间操作一次函数,这样也能达到循环的目的。
下面是QT使用定时器的两种方式:
1.通过protected继承专门用于定时器的函数。
2.自定义私有槽函数并对其进行与时间信号的连接。
一、继承的方法
1.新建一个QT工程
本次基类选择widget(选择mainwindow也是一样的,只是占的大小不一样而已)。
2.修改widget.h文件
引入虚函数void timerEvent(QTimerEvent *e);注意:函数名字和函数里的参数一定要一模一样,因为这是继承过来的,这个函数的名字和参数在上级文件里是存在的。
在私有变量中新建三个int类型变量id1,id2,id3
修改后的文件如下:
#ifndef WIDGET_H
#define WIDGET_H
#include
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
//三个新的变量用于存放定时器的id
int id1;
int id2;
int id3;
protected:
//继承过来的定时器相关函数
void timerEvent(QTimerEvent *e);
};
#endif // WIDGET_H
4.修改widget.cpp文件
在构造函数中给三个定时器id赋予他们的间隔时间
描述timerEvent函数的功能
具体代码:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//开启三个定时器,单位为ms
id1=startTimer(1000);
id2=startTimer(2000);
id3=startTimer(5000);
}
Widget::~Widget()
{
delete ui;
}
Widget::timerEvent(QTimerEvent *e)
{
if(e->timerId()==id1){
ui->label->setText(tr("%1").arg(qrand()%10));//返回一个10以内的随机值
}
else if(e->timerId()==id2){
ui->label_2->setText("hello!");//显示一个hello
}
else{
qApp->quit();//退出程序
}
}
开启三个定时器,其id分别为id1,id2,id3,三个id分别对应不同的时间间隔,当超过时间间隔后,定时器会溢出发出一个信号并重置自己。(时间间隔单位为ms)
三个功能分别为:
1.每隔一秒,在第一个标签上显示一个10以内的随机值。
2.第二秒后,第二个标签上显示hello。
3.五秒后,退出程序。
二、自定义定时器函数
1.修改widget.h
加入一个私有槽函数,并引入QTimer和QDateTime两个头文件,分别用于定时器和显示当前时间功能。
具体代码如下:
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
#include
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
private slots:
void timerupdate();
}
#endif // WIDGET_H
3…修改widget.cpp 文件
在构造函数里新建一个定时器变量并将其和前面定义的定时器函数连接起来。
描述定时器函数。
具体代码如下:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QTimer *timer=new QTimer(this);//新建一个名为timer的QTimer类型变量
connect(timer,&QTimer::timeout,this,&Widget::timerupdate);//信号与槽的连接,当定时器超时时执行timerupdate函数
timer->start(1000);//新建的定时器间隔为1s
}
Widget::~Widget()
{
delete ui;
}
void Widget::timerupdate()
{
QDateTime time=QDateTime::currentDateTime();//获取当前时间
QString str=time.toString("yyyy-MM-dd hh:mm:ss dddd");
ui->lineEdit->setText(str);//显示当前时间
}
此代码两个可能疑惑的点:
1.信号与槽的连接:connect(timer,&QTimer::timeout,this,&Widget::timerupdate);
参数一为发送信号者:这里为定时器,参数二为发出的信号:这里为定时器超时,参数三为接收者:这里为当前界面本身,参数四为槽函数:这里为我们开始定义的槽函数。
2.显示时间时的 “yyyy-MM-dd hh:mm:ss dddd”
可能有人疑问这是一个什么格式?yyyy代表四位的年份;MM代表月份(MMMM也可以,注意是大写);dd代表日期(dddd不可以);hh代表两位的小时;mm代表两位的分钟;ss代表两位的秒;dddd代表星期数(小写且四位)。
本章到此结束,下一篇应该是绘制图形的介绍,会介绍一个绘制动态图形的实例。