前情提要
前几篇记录了Qt概述、手搓窗口、Qt Creater制作简易计算器。
本篇主题
Qt里的计时器分为两种,第一种是QObject定时器,第二种是QTimer。今天这篇讲QObject类
知识介绍
(1)成员函数:
开启定时器:startTimer(参数是时间步长,以毫秒为单位);结束定时器:killTimer(参数是定时器编号);处理事件:timerEvent(参数是QTimerEvent 指针)
(2)继承关系
在设计界面的右侧属性栏可以看到所以存在关系的类的继承关系
在最上边的是基类,下边的是继承类,越靠下子孙性越强。可见,QObject是一个很基础的基类,所以按钮类成员函数可以调用部分QObject类的公有函数
(3)功能逻辑
标记一个存储定时器编号的变量,每次使用startTimer函数都可以返回定时器编号,这个编号可以代表这次开始的定时器。timerEvent函数是一个事件函数,函数体里是每次时间步长要进行的事件,通过比较定时器编号是否一致可以判断是不是这个定时器需要处理这个函数
实际操作
实现一个一秒钟自动切换照片的电子相册
(1)创建工程
命名为ObjectTimer,选择qmake编译,QWiget类
好了,创建出项目就开始绘制界面
(2)绘制界面
图片是在标签上显示的,所以要在设计处放一个标签;要有开始和暂停,所以要放两个按钮
画完ui之后把控件命名改一下,然后开始逻辑实现
(3)逻辑实现
点击开始按钮之后,定时器就启动了,所以要在开始按钮出转到槽处理
#define TIMEOUT 1*1000
这一句的解释:QObject类的startTime函数参数是数字,多大就是多少毫秒,我们想要的时间步长是一秒,所以就宏定义一个一秒的时间步长
void Widget::on_startButton_clicked()
{
this->startTimer(TIMEOUT);
}
在槽函数中写一个startTime函数,传入一秒的时间步长,而这个时间步长到了要干什么呢?那就有了下一个函数:timerEvent,需要注意的是,这个函数名必须叫作timerEvent
void Widget::timerEvent(QTimerEvent *event)
{
if(event->timerId()==myTimerId)
return;
}
在头文件的类里定义这样一个函数,然后在这个函数里实现具体的功能
void Widget::timerEvent(QTimerEvent *event)
{
if(event->timerId()!=myTimerId)
{
return;
}
QString path("E:\ObiectTimer\");
path += QString::number(picId);
path += ".jpg";
QPixmap pix(path);
ui->label->setPixmap(pix);
picId++;
if(4==picId)
{
picId=1;
}
}
这段代码的逻辑就是:如果当前事件的编号不是这个定时器的编号,就不动用这个函数。先把同一个文件夹的绝对路径写出来,然后文件夹所有图片都是1.jpg、2.jpg、3.jpg这样的统一格式,所以补齐路径就可以打开图片。然后照片到了最后一张就更新回第一张。
这个开始实现了,暂停再实现一下
void Widget::on_stopButton_clicked()
{
this->killTimer(myTimerId);
}
这段代码就实现了暂停功能:把时间暂停即可。
然后实测是视频就不放了,总之是成功了。
篇末总结
知识:
1.图片是附在标签上的,需要用到QPixmap类
2.QString::number函数可以把数字转换成字符串
3.Qt里有系统定义的宏,正是有了这些宏,Qt才能发挥出它的功能
收获:
-
初步理解了工程文件的写法:有用的系统头文件定义在自定义头文件里,cpp文件一个实现自定义头文件,一个main.cpp执行代码。
-
初步理解了框架的作用:提供有用的类库、提供必须的处理机制、引导项目结构、附有实用工具