Qt 入门第五篇:QTimer 核心用法 + connect 函数实战

0 阅读2分钟

前情提要

前几次介绍了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的使用