【QT】 QT定时器的使用

发布于:2025-04-16 ⋅ 阅读:(37) ⋅ 点赞:(0)

1. QTimer介绍

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

(1)QTimer的使用方法步骤

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

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

// 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在标签上切换图片

// 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)主要方法

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

3.时间 QTime

(1)主要方法

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

示例代码:

// 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());
}

现象:

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到