文章目录
- 关于 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();
}