当前位置: 首页 > news >正文

【QT】定时器使用

文章目录

  • 关于 Qt 定时器使用的注意细节总结
  • 实例-检查工具使用周期时间是否合理
    • UI设计
    • 头文件 remind.h
    • 源文件 remind.cpp
    • 实现效果

关于 Qt 定时器使用的注意细节总结

一、创建与初始化

  1. 使用 QTimer 类来创建定时器。可以在构造函数中指定父对象,确保定时器在正确的对象生命周期内被管理。
    • 例如:QTimer *timer = new QTimer(this);,这里的 this 表示定时器的父对象,通常是一个 QObject 派生类的实例,这样可以确保在父对象销毁时,定时器也能被正确清理。

二、设置时间间隔

  1. 通过 setInterval 方法设置定时器的时间间隔,单位为毫秒。
    • 例如:timer->setInterval(1000); 设置定时器每 1000 毫秒触发一次。

三、连接信号与槽

  1. 使用 connect 函数将定时器的 timeout 信号与相应的槽函数连接起来,以便在定时器超时时执行特定的操作。
    • 例如:connect(timer, &QTimer::timeout, this, &YourClass::yourSlotFunction);,当定时器超时时,会调用 YourClass 类中的 yourSlotFunction 槽函数。

四、启动定时器

  1. 使用 start 方法启动定时器,使其开始计时并按照设定的时间间隔触发信号。
    • 例如:timer->start();,启动定时器后,它会按照设定的时间间隔不断触发 timeout 信号。

五、静态变量与计数器的使用

  1. 在定时器的槽函数中,如果需要使用静态变量作为计数器,要注意其作用域和生命周期。确保在合适的时候进行初始化和更新,避免出现不可预期的结果。
    • 例如:在定时器超时处理槽函数中使用静态变量 cnt 作为计数器时,要清楚其在多次调用槽函数过程中的变化情况,避免出现计数错误或逻辑混乱。

六、注意资源管理

  1. 当不再需要定时器时,应及时停止并删除定时器对象,以避免资源泄漏。特别是在定时器的父对象生命周期结束时,要确保定时器也能被正确清理。
    • 例如:在对象的析构函数中,可以停止定时器并删除定时器指针,如 if (timer) { timer->stop(); delete timer; timer = nullptr; }

总之,在使用 Qt 定时器时,要注意正确地创建、初始化、连接信号与槽、启动和管理定时器资源,以确保定时器在应用程序中能够稳定、可靠地工作。

实例-检查工具使用周期时间是否合理

UI设计

在这里插入图片描述

头文件 remind.h

#ifndef REMIND_H
#define REMIND_H#include <QDialog>
#include <QTimer>
#include <QDateTime>
#include <QDate>// 引入生成的界面头文件
namespace Ui {
class remind;
}// remind 类的定义
class remind : public QDialog
{Q_OBJECT
public:// 显式构造函数,接受一个父指针参数,默认为 nullptrexplicit remind(QWidget *parent = nullptr);// 析构函数~remind();// 获取 remind 类的唯一实例的静态方法static remind *get_instance(void);// 检查工具时间是否有效的方法void is_tool_time_vaild(void);// 表示剩余天数的成员变量int days;
public slots:// 进入按钮点击处理槽函数void do_button_enter_handle(void);// 退出按钮点击处理槽函数void do_button_exit_handle(void);// 定时器超时处理槽函数void do_timer_out_handle(void);
private:// 指向生成的界面类的指针Ui::remind *ui;// 静态成员变量,用于存储唯一的 remind 实例指针static remind* instance;
};#endif // REMIND_H

源文件 remind.cpp

#include "Remind.h"
#include "ui_Remind.h"
#include <qDebug.h>// 静态成员变量初始化,初始值为 nullptr,表示当前没有创建 remind 实例
remind* remind::instance = nullptr;// remind 类的构造函数
remind::remind(QWidget *parent): QDialog(parent), ui(new Ui::remind)
{// 设置界面ui->setupUi(this);// 输出调试信息,表示 remind 对象构建了qDebug("remind 对象构建了");// 检查工具时间是否有效is_tool_time_vaild();// 连接进入按钮的点击信号与对应的槽函数connect(ui->pushButton_enter, &QPushButton::clicked, this, &remind::do_button_enter_handle);// 连接退出按钮的点击信号与对应的槽函数connect(ui->pushButton_exit, &QPushButton::clicked,this, &remind::do_button_exit_handle);
}// remind 类的析构函数
remind::~remind()
{// 删除界面指针delete ui;
}// 获取 remind 类的唯一实例的静态方法
remind* remind::get_instance(void)
{// 如果当前没有实例,则创建一个新的实例if (!instance) {instance = new remind();}// 返回实例指针return instance;
}// 定时器超时处理槽函数
void remind::do_timer_out_handle(void)
{
// 定义自动进入的时间间隔为 3 秒
#define AUTO_ENTRY_TIME (3)static int cnt = AUTO_ENTRY_TIME;// 如果剩余天数大于等于 0,表示工具未过期if (days >= 0) {// 在文本浏览器中显示剩余时间ui->textBrowser->append(QString::number(cnt) + "s 后自动进入");// 当计数器为 0 时,接受对话框,即自动进入if (0 == cnt)accept();}// 计数器递减cnt--;
}// 检查工具时间是否有效的方法
void remind::is_tool_time_vaild(void)
{// 输出调试信息,表示正在检查工具时间有效性qDebug("check tool time validity");// 创建一个定时器对象QTimer *timer = new QTimer(this);// 设置定时器的时间间隔为 1000 毫秒(1 秒)timer->setInterval(1000);// 连接定时器超时信号与 do_timer_out_handle 槽函数connect(timer, &QTimer::timeout, this, &remind::do_timer_out_handle);// 启动定时器timer->start();// 设置目标日期为 2024 年 9 月 14 日QDate targetDate(2024, 9, 14);// 获取当前日期时间QDateTime currentDateTime = QDateTime::currentDateTime();// 提取当前日期QDate currentDate = currentDateTime.date();// 计算当前日期与目标日期之间的天数差days = currentDate.daysTo(targetDate);// 拼接字符串并在文本浏览器中显示剩余有效期信息QString append = "剩余有效期 :";append += QString::number(days);append += "\n注意:本工具仅适用于 XXXXX 产品";ui->textBrowser->append(append);// 如果天数小于 0,表示工具已过期if (days < 0) {// 禁用退出按钮ui->pushButton_exit->setEnabled(false);// 在文本浏览器中显示过期提示信息ui->textBrowser->append("当前版本已过期,请联系开发人员");}
}// 进入按钮点击处理槽函数
void remind::do_button_enter_handle(void)
{// 输出调试信息,表示进入按钮被点击qDebug("button_enter");// 调用 accept() 函数表示接受对话框,通常会导致对话框关闭并返回一个特定的值(通常是 QDialog::Accepted),表示用户选择了“进入”操作。accept();
}// 退出按钮点击处理槽函数
void remind::do_button_exit_handle(void)
{// 输出调试信息,表示退出按钮被点击qDebug("button_exit");// 调用 reject() 函数表示拒绝对话框,通常会导致对话框关闭并返回一个特定的值(通常是 QDialog::Rejected),表示用户选择了“退出”操作。reject();
}

实现效果

在这里插入图片描述


http://www.mrgr.cn/news/27768.html

相关文章:

  • 计算机网络网关简介
  • 方法论-WPS模型(高效沟通和决策分析的框架)
  • 【Java Web】Servlet
  • SpringBoot3全面复习
  • 生产环境中AI调用的优化:AI网关高价值应用实践
  • VBA学习笔记:基础知识
  • 第R3周:LSTM-火灾温度预测:3. nn.LSTM() 函数详解
  • 鸿蒙之Hello Word 遇坑总结 mac系统 不能预览 提示 Only files in a module can be previewed 解决办法
  • 分贝转换 1 mVpp = 9.03dBmV
  • RISCV64应用符号解析的实现机制
  • 响应式CSS 媒体查询——WEB开发系列39
  • 艾里斑(Airy Disk)与瑞利判据(Rayleigh criterion)
  • 2024上半年国产操作系统卖疯了!麒麟4.9亿,统信1.9亿!
  • 41.在 CSS 中使用 clamp() 实现响应式排版
  • 【智路】智路OS Perception Fusion Service
  • 暗界正方形之谜
  • 复杂情感识别系统
  • CAD_Electrical 2022使用记录
  • 【加密算法基础——RSA加密特点分析及解密方式】
  • Java面向对象六大设计原则总结(超级详细,附有代码、图解以及案例)
  • 深入理解Python中的“_,”:一个实用的语法特性
  • 神经网络通俗理解学习笔记(3)注意力神经网络
  • 树莓派5上手
  • Java多线程1
  • 闲鱼 sign 阿里228滑块 分析
  • Spring Boot,在应用程序启动后执行某些 SQL 语句