QT学习——day6
QTimer定时器类的使用
在进行窗口程序的处理过程中, 经常要周期性的执行某些操作, 或者制作一些动画效果,看似比较复杂的问题使用定时器就可以完美的解决这些问题。
要使用它,只需创建一个QTimer类对象,然后调用其
start()
函数开启定时器,此后QTimer对象就会周期性的发出timeout()
信号。
创建定时器类对象
1.在需要定时器的窗口类中添加头文件
#include<QTime>//用来调用currentTime()函数获取当前系统时间
#include"QTimer"//定时器类对象的头文件
2.将QTimer类实例化为一个对象指针,并通过this指针与当前主窗口绑定,使其自动在析构函数中回收为指针分配的空间。
QTimer *tim=new QTimer(this);
用connect函数进行信号连接
3.调用connect函数将点击事件与计时器信号发射函数进行连接,当点击事件执行后,QTimer将以每1000ms的频率通过timeout中的start发射信号。
connect(ui->loopbtn,&QPushButton::clicked,this,[=](){
emit tim->start(1000);//1000ms=1s
});
4.调用connect函数将计时器发射的信号与QTIme类处理函数进行连接。使用lambda表达式,在表达式中根据信号接受的频率调用QTime类中的currentTime()函数获取当前时间并格式化为QString类型进行输出。
connect(tim,&QTimer::timeout,this,[=](){
QTime now_t=QTime::currentTime();
QString t_str=now_t.toString("hh:mm:ss.zzz");
ui->curTime->setText(t_str);
});
5.可以加个判断函数来优化一下:
connect(ui->loopbtn,&QPushButton::clicked,this,[=](){
if(tim->isActive())
{
tim->stop();
ui->loopbtn->setText("开始");
}
else
{
emit tim->start(1000);//1000ms=1s
ui->loopbtn->setText("关闭");
}
});
这样就可以控制计时器啦。
6.三种精度:
emit tim->start(Qt::CoarseTimer);//默认精度,误差为百分之毫秒
emit tim->start(Qt::PreciseTimer);//最高精度,误差为1毫秒
emit tim->start(Qt::VeryCoarseTimer);//最粗糙的精度,误差在一秒左右。
单次信号发射
调用QTimer中的singleShot函数,每隔固定的时间发射一次信号,并且为单次发射。
connect(ui->oncebtn,&QPushButton::clicked,this,[=](){
QTimer::singleShot(2000,this,[=](){
QTime now_t=QTime::currentTime();
QString t_str=now_t.toString("hh:mm:ss.zzz");
ui->oncetime->setText(t_str);
});
});
窗口控件添加槽函数的快捷方式
在对应的控件上有右击,在列表中点击“转到槽”,弹出选择窗口,选择对应触发事件,编译器会在.cpp中自动添加一个槽成员函数,直接在该函数编写事件处理函数即可。
void Mywidget::on_movebtn_clicked()
{
//编写事件处理函数体
}