【QT】定时器使用
文章目录
- 关于 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:// 显式构造函数,接受一个父指针参数,默认为 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();
}