前情提要
前几次介绍了Qt的基础知识,完成了一个简单窗口、一个计算器、一个QObject实现的简单轮播相册,由于Qt里提供了QTimer,所以实际上不需要用QObject。所以这一篇要用QTimer实现一个轮播相册
开发过程
(1)创建项目
依旧是widget、qmake,项目命名为QTimer
(2)设计UI
有了上次的经验,这次能更快上手,提前把scaledContents勾选上
(3)处理开始和结束按钮
先把开始和结束两个按钮转到槽,然后包含引用头文件,宏定义一个时间步长,并创建一个QTimer型的指针对象作为窗口类的私有成员
#include <QTimer>
#define TIMEOUT 1000
QTimer *timer;
timer = new QTimer;
void Widget::on_startButton_clicked()
{
timer->start(TIMEOUT);
}
下面是显示图片的代码:
QImage img;
img.load("E:\\ObiectTimer\\1.jpg");
ui->label->setPixmap(QPixmap::fromImage(img));
这段代码写在构造函数里
这个项目首次用到connect函数:
//定时器时间到,发出timeout信号
connect(timer,&QTimer::timeout,this,&Widget::timeoutSlot);
这个参数的意思是:传信号者,传信号函数,收信号者,要调用的函数
要调用的槽函数是这个:
void Widget::timeoutSlot()
{
QString path("E:\\ObiectTimer\\");
path += QString::number(picID);
path+=".jpg";
QImage img;
img.load(path);
ui->label->setPixmap(QPixmap::fromImage(img));
picID++;
if(picID==4)
{
picID=1;
}
}
原理就是轮换地址
下面实现结束按钮:
void Widget::on_stopButton_clicked()
{
timer->stop();
}
注意:前边new了一个QTimer的对象,那我们配套的要在析构函数里写一个delete
Widget::~Widget()
{
delete ui;
delete timer;
}
这样就实现了简易轮播相册。
仅仅这么看,QObject和QTimer似乎没有多大区别,都是开始,结束,再开始,再结束
但是QTImer可以只进行一次时间步长
(4)增加单次功能
我们在ui里添加一个单次按钮,用它的槽函数来实现只进行一次时间步长。
void Widget::on_singleButton_clicked()
{
QTimer::singleShot(1000,this,SLOT(timeoutSlot()));
}
传入参数的意思是:时间步长,处理者,用哪一个槽函数处理
学到的知识
(1)两个计时器的区别
1.QObject是继承关系中最高级的基类,它的主要功能是事件处理而非定时器,QTimer是继承QObject的,它是专门用于定时器功能的类
2.单就定时器功能实现来看,QObject不能单次触发,QTimer可以单次触发
(2)conncet函数
信号只需声明无需实现,槽就是具体实现方法,connect函数负责把发出信号的、信号、接受信号的、实现方法联系起来
(3)新的添加图片的方法
使用QImage类定义对象,再用它的对象调用load成员函数,然后用ui->setPix函数展示图片
本项目比较简单,重点在于QTimer的使用