【QT】 QT定时器的使用

QT定时器的使用

1. QTimer介绍

QTimer是Qt中提供的一个定时器类,它可以定时触发一个信号,用于周期性执行一些操作。使用QTimer,可以轻松地实现定时器功能,如周期性地更新UI界面,周期性地执行一些任务等。

(1)QTimer的使用方法步骤

cpp 复制代码
第一步:定义QTimer的对象
QTimer(QObject *parent = Q_NULLPTR)
参数:parent --》this指针
第二步:设置超时时间(定时时间)
void setInterval(int msec)
参数:msec --》毫秒
第三步:启动定时器
void QTimer::start()
超时时间一旦到了,QTimer对象会自动触发timeout()信号,程序员只需要关联这个信号,在自定义的槽函数去实现自己的代码逻辑即可
第四步:关闭定时器
void QTimer::stop()

示例代码1:定时器的启动和关闭

cpp 复制代码
// widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void onTimeout();
    void onStartTimer();
    void onStopTimer();

private:
    Ui::Widget *ui;
    QTimer *myTimer;
};
#endif // WIDGET_H

// widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QTimer>
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 初始化定时器对象
    myTimer = new QTimer(this);
    // 设置定时时间(超时时间)
    myTimer->setInterval(1000);

    // 时间到了QTimer的对象会自动触发timeout信号
    connect(myTimer, SIGNAL(timeout()), this, SLOT(onTimeout()));
    // 关联启动定时器按钮的槽函数
    connect(ui->btn_start, SIGNAL(clicked()), this, SLOT(onStartTimer()));
    // 关联关闭定时器按钮的槽函数
    connect(ui->btn_close, SIGNAL(clicked()), this, SLOT(onStopTimer()));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::onTimeout()
{
    qDebug()<<"hello world";
}

void Widget::onStartTimer()
{
    qDebug()<<"StartTimer";
    myTimer->start();
}

void Widget::onStopTimer()
{
    qDebug()<<"stopTimer";
    myTimer->stop();
}

现象:

示例代码2:定时器每隔1s在标签上切换图片

cpp 复制代码
// widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_clicked();
    void fun();
    void on_pushButton_2_clicked();

private:
    Ui::Widget *ui;
    QStringList piclist;
    QTimer *mytimer;
    int n; //图片的下标
};
#endif // WIDGET_H

// widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QTimer>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //把所有要显示的图片存放到字符串列表中
    n=0;
    piclist.append("C:\\Users\\LimingRong\\Desktop\\vm_shared\\code\\QT_proj\\250414_timerSwitchPic\\res\\1.png");
    piclist.append("C:\\Users\\LimingRong\\Desktop\\vm_shared\\code\\QT_proj\\250414_timerSwitchPic\\res\\2.png");
    piclist.append("C:\\Users\\LimingRong\\Desktop\\vm_shared\\code\\QT_proj\\250414_timerSwitchPic\\res\\3.png");
    piclist.append("C:\\Users\\LimingRong\\Desktop\\vm_shared\\code\\QT_proj\\250414_timerSwitchPic\\res\\4.png");
    piclist.append("C:\\Users\\LimingRong\\Desktop\\vm_shared\\code\\QT_proj\\250414_timerSwitchPic\\res\\5.png");

    //初始化定时器
    mytimer=new QTimer(this);
    mytimer->setInterval(1000); //1秒
    connect(mytimer,SIGNAL(timeout()),this,SLOT(fun()));
}

Widget::~Widget()
{
    delete ui;
}

//启动定时器
void Widget::on_pushButton_clicked()
{
    mytimer->start();
}

void Widget::fun()
{
    //每隔一秒钟在标签上切换显示图片
    QPixmap map(piclist.at(n));
    map.scaled(ui->label->width(),ui->label->height());
    ui->label->setScaledContents(true);
    ui->label->setPixmap(map);
    //由于只有5张(piclist.size())图片,n不可以无限制++
    if(n<piclist.size()-1)
        n++;
    else
        n=0;
}

void Widget::on_pushButton_2_clicked()
{
    mytimer->stop();
}

现象:

(2)实际开发的作用

定时器替代死循环/循环

2.日期 QDate

(1)主要方法

cpp 复制代码
[static] QDate QDate::currentDate()
返回值:QDate的对象,表示当前系统的日期
int QDate::year() const
返回值:返回年
int QDate::month() const
返回值:返回月
int QDate::day() const
返回值:返回日
toString("yyyy-MM-dd")
把日期转换成字符串

3.时间 QTime

(1)主要方法

cpp 复制代码
[static] QTime QTime::currentTime()
返回值:QTime对象,表示当前系统的时间
int QTime::hour() const
int QTime::minute() const
int QTime::second() const
toString("hh:mm:ss")
把时间转换成字符串

示例代码:

cpp 复制代码
// widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

public slots:
    void onUpdateTime(void);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

// widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QTime>
#include <QTimer>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 1.实例化定时器对象
    QTimer *timer = new QTimer;
    // 2.定时器启动后会以指定的间隔时间发射timeout信号,关联对应的槽函数,执行对应的操作
    connect(timer, &QTimer::timeout, this, &Widget::onUpdateTime);
    // 3.启动定时器 1s定时
    timer->start(1000);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::onUpdateTime()
{
    // 显示到标签上
    ui->label_2->setText(QTime::currentTime().toString());
}

现象:

相关推荐
笨笨马甲21 分钟前
附加模块--Qt OpenGL模块功能及架构
开发语言·qt
uyeonashi4 小时前
【QT控件】输入类控件详解
开发语言·c++·qt
galaxy_strive14 小时前
绘制饼图详细过程
开发语言·c++·qt
委婉待续1 天前
Qt的学习(一)
开发语言·qt·学习
笨笨马甲1 天前
Qt Quick Layout功能及架构
开发语言·qt
feiyangqingyun1 天前
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
c++·qt·udp·gb28181
jllws11 天前
Qt学习及使用_第1部分_认识Qt---学习目的及技术准备
qt·c++框架
到点就困告1 天前
海康工业相机SDK二次开发(VS+QT+海康SDK+C++)
数码相机·qt·海康
唐墨1232 天前
android与Qt类比
android·开发语言·qt
道剑剑非道2 天前
QT开发技术【ffmpeg + QAudioOutput】音乐播放器 完善
开发语言·qt·ffmpeg