【Qt】Qt系统 | Qt事件 | 定时器

定时器

Qt 中在进行窗口程序的处理过程中,经常要周期性的执行某些动作,或者制作一些动画效果,使用定时器可以实现这些需求。
定时器,会在间隔一定时间后,执行某一个任务。常见使用如倒计时,弹窗自动关闭之类等


Qt 中的定时器有 QTimeEventQTimer 这两个类

  • QTimerEvent类 用来描述一个定时器事件。在使用时通过 startTimer() 函数开启一个定时器,这个函数需要输入一个以毫秒为单位的整数作为参数来表明设定的时间它返回的整型值代表这个定时器,类似文件描述符和进程ID
  • QTimer类 实现一个定时器,它提供了更高层次的编程接口,如:使用信号槽,还可以设置只运行一次的定时器

QTimerEvent

上面说过,QTimeEvent 通过 startTimer() 函数创建的定时器触发,一次 startTimer() 就会创建一个定时器,函数返回值为整数,可以理解为定时器编号,类似计算机操作系统中的文件 struct file 或 进程task struct,由系统维护。
startTimer()函数原型如下:
在这里插入图片描述

int interval:定时器触发事件的周期,单位为毫秒
Qt::TimerType timerType:定时器类型,主要是精准度不同

在这里插入图片描述

  • Qt::PreciseTimer:将准确度保持毫秒级的精度
  • Qt::CoarseTimer:将准确度保持在所需间隔的5%以内
  • Qt::VeryCoarseTimer:将准确度保持完整的秒精度

代码示例:创建两个Label,显示数字。第一个Label的数字每1秒累加一次,第二个Label的数字每两秒累加一次

  1. 在 UI 界面文件放置两个 Label 控件
    在这里插入图片描述
  2. 编写 widget.h,声明 timerEvent(),定义两个整型变量接收定时器编号
    在这里插入图片描述
  3. 编写 widget.cpp,实现 timerEvent()
void Widget::timerEvent(QTimerEvent *event)
{
    //startTimer创建的定时器周期到达都会触发该事件
    if(timerid_1 == event->timerId())
    {
        //第一个定时器,每一秒触发一次,累加数字
        static int num = 1;
        qDebug() << "定时器1触发,时间:" << num;
        ui->label->setText(QString::number(num++));
    }
    else if(timerid_2 == event->timerId())
    {
        //第二个定时器,每两秒触发一次,累加数字
        static int num = 1;
        qDebug() << "定时器2触发,时间:" << num;
        ui->label_2->setText(QString::number(num++));
    }
}
  1. 运行结果如下:
    在这里插入图片描述

QTimer

QTimer 则使用信号槽机制,完成定时器

代码示例:实现简易的计时器
在 UI 界面放置一个 Label 标签,两个按钮,分别是"开始" 和 “停止”,当点击开始时每隔1秒累加一次,点击“停止”暂停计数

  1. 设计 UI 界面如下:在这里插入图片描述
  2. 编写 widget.cpp,编写相关信号槽函数
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QTimer *timer = new QTimer(this);
    //连接“开始”按钮信号槽
    connect(ui->pushButton, &QPushButton::clicked, this, [=](){
        timer->start(1000);
    });
    //连接定时器信号槽
    connect(timer, &QTimer::timeout, this, [=](){
        static int num = 1;
        ui->label->setText(QString::number(num++));
    });
    //连接“停止”按钮信号槽
    connect(ui->pushButton_2, &QPushButton::clicked, this, [=](){
        timer->stop();
    });
}
  1. 运行结果如下:
    在这里插入图片描述

获取系统日期及时间

在 Qt 中,获取系统的日期及实时时间可以通过 QTimer类 或 QDateTime类
QDateTime类 提供了字符串格式的时间。字符串形式的时间输出格式由 toString() 方法中的 format 参数列表决定

时间日期格式,形如yyyy/M/d H:mm 2024/07/31 09:35

可用的参数列表如下:

  • y表示年份
  • M表示月份
  • d表示日期
  • H表示小时
  • m表示分钟
  • s表示秒

代码示例:获取系统日期及实时时间

  1. 设计 UI 界面文件。放置一个Label控件, 用来显示日期和时间,放置两个按钮:“开始” 和 “停止”
    在这里插入图片描述
  2. 编写 widget.cpp,连接相应信号槽
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //创建定时器
    QTimer* timer = new QTimer(this);
    //连接“开始”按钮信号槽
    connect(ui->pushButton, &QPushButton::clicked, this, [=](){
        timer->start(1000);
    });
    //连接定时器信号槽
    connect(timer, &QTimer::timeout, this, [=](){
        QString time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
        ui->label->setText(time);
    });
    //连接“停止”按钮信号槽
    connect(ui->pushButton_2, &QPushButton::clicked, this, [=](){
        timer->stop();
    });
}
  1. 运行结果如下:
    在这里插入图片描述

结束语
感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值