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

现象:

相关推荐
奇树谦2 小时前
3-5年工控上位机(C++/Qt)面试题|聚焦实战,直击核心模块
c++·qt
爱吃巧克力的程序媛3 小时前
COM 对象的核心基础知识
c++·qt
小喻同学i3 小时前
卸载VS2015,安装VS2017后Qt报错问题
开发语言·qt
载数而行5203 小时前
Qt事件event分发,事件和信号关系,事件过滤
qt
载数而行5203 小时前
Qt鼠标处理的项目,包含事件分发、处理机制
qt
qq_283720053 小时前
Qt QML 中为 ComBox设置鸿蒙字体(HarmonyOS Sans)——适配 Qt 5.6.x 与 Qt 5.12+
c++·qt·harmonyos
小郭学习之路4 小时前
Qt vs tools的一个编译问题
开发语言·qt
C++ 老炮儿的技术栈5 小时前
Qt 开发机器人客户端程序
c语言·开发语言·c++·windows·qt·机器人
Ronin3055 小时前
【Qt系统相关】Qt系统相关
网络·qt·音视频·多线程·定时器·事件·qt文件
娇娇yyyyyy21 小时前
QT编程(15): Qt 按键事件和定时器事件
开发语言·qt