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

现象:

相关推荐
疋瓞11 小时前
C++_win_QT6学习《3》_结合qt项目开发学习git仓库相关知识
c++·qt·学习
锡兰_CC13 小时前
无缝触达,卓越体验:开启openEuler世界的任意门
服务器·网络·数据库·c++·图像处理·qt·nginx
Source.Liu13 小时前
【LibreCAD】RS_Pen 类详解
qt·cad
油炸自行车15 小时前
【Qt】Qt Creator Debug模式提示“缺少 Windows CDB 调试器配套的扩展组件“”
开发语言·windows·qt
我要升天!15 小时前
QT -- 网络编程
c语言·开发语言·网络·c++·qt
墨月白15 小时前
[QT]QList 相关接口
qt
GIS阵地15 小时前
Qt实现简易仪表盘
开发语言·c++·qt·pyqt·qgis·qt5·地理信息系统
电子_咸鱼17 小时前
【QT SDK 下载安装步骤详解 + QT Creator 导航栏使用教程】
服务器·开发语言·网络·windows·vscode·qt·visual studio code
CC.GG19 小时前
【Qt】Qt初识
开发语言·qt
xun_xin66619 小时前
如何解决Qt与OpenCV编译器不匹配问题
开发语言·qt·opencv