文章目录
- 关于 Qt 定时器使用的注意细节总结
- 实例-检查工具使用周期时间是否合理
- UI设计
- 头文件 remind.h
- 源文件 remind.cpp
- 实现效果
 
关于 Qt 定时器使用的注意细节总结
一、创建与初始化
- 使用 QTimer类来创建定时器。可以在构造函数中指定父对象,确保定时器在正确的对象生命周期内被管理。- 例如:QTimer *timer = new QTimer(this);,这里的this表示定时器的父对象,通常是一个QObject派生类的实例,这样可以确保在父对象销毁时,定时器也能被正确清理。
 
- 例如:
二、设置时间间隔
- 通过 setInterval方法设置定时器的时间间隔,单位为毫秒。- 例如:timer->setInterval(1000);设置定时器每 1000 毫秒触发一次。
 
- 例如:
三、连接信号与槽
- 使用 connect函数将定时器的timeout信号与相应的槽函数连接起来,以便在定时器超时时执行特定的操作。- 例如:connect(timer, &QTimer::timeout, this, &YourClass::yourSlotFunction);,当定时器超时时,会调用YourClass类中的yourSlotFunction槽函数。
 
- 例如:
四、启动定时器
- 使用 start方法启动定时器,使其开始计时并按照设定的时间间隔触发信号。- 例如:timer->start();,启动定时器后,它会按照设定的时间间隔不断触发timeout信号。
 
- 例如:
五、静态变量与计数器的使用
- 在定时器的槽函数中,如果需要使用静态变量作为计数器,要注意其作用域和生命周期。确保在合适的时候进行初始化和更新,避免出现不可预期的结果。 
  - 例如:在定时器超时处理槽函数中使用静态变量 cnt作为计数器时,要清楚其在多次调用槽函数过程中的变化情况,避免出现计数错误或逻辑混乱。
 
- 例如:在定时器超时处理槽函数中使用静态变量 
六、注意资源管理
- 当不再需要定时器时,应及时停止并删除定时器对象,以避免资源泄漏。特别是在定时器的父对象生命周期结束时,要确保定时器也能被正确清理。 
  - 例如:在对象的析构函数中,可以停止定时器并删除定时器指针,如 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:
    // 显式构造函数,接受一个父指针参数,默认为 nullptr
    explicit 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();
}
实现效果




















