QT/C++ 消息定时管理器

QT/C++ 消息定时管理器


一、演示效果

二、核心代码

c 复制代码
// mainwindow.cpp
#include "mainwindow.h"
#include "taskeditdialog.h"
#include <QMessageBox>
#include <QFile>
#include <QDataStream>
#include <QDateTime>
#include <QLabel>
#include <QStatusBar>

MainWindow::MainWindow(QWidget *parent)
	: QMainWindow(parent), m_checkTimer(new QTimer(this)), m_running(false)
{
	setupUI();

	// 配置检查定时器,每秒钟检查一次
	m_checkTimer->setInterval(1000);
	connect(m_checkTimer, &QTimer::timeout, this, &MainWindow::checkTasks);

	// 加载保存的任务
	loadTasks();
	updateTaskList();
}

MainWindow::~MainWindow()
{
	saveTasks();
	delete m_checkTimer;
}

void MainWindow::setupUI()
{
	setWindowTitle(u8"定时消息提示");
	setMinimumSize(600, 400);

	// 创建UI组件
	taskListWidget = new QListWidget(this);
	taskListWidget->setAlternatingRowColors(true);

	addTaskButton = new QPushButton(u8"添加任务", this);
	editTaskButton = new QPushButton(u8"编辑任务", this);
	deleteTaskButton = new QPushButton(u8"删除任务", this);
	startStopButton = new QPushButton(u8"启动监控", this);

	// 连接信号槽
	connect(addTaskButton, &QPushButton::clicked, this, &MainWindow::on_addTaskButton_clicked);
	connect(editTaskButton, &QPushButton::clicked, this, &MainWindow::on_editTaskButton_clicked);
	connect(deleteTaskButton, &QPushButton::clicked, this, &MainWindow::on_deleteTaskButton_clicked);
	connect(startStopButton, &QPushButton::clicked, this, &MainWindow::on_startStopButton_clicked);

	// 设置按钮布局
	QHBoxLayout *buttonLayout = new QHBoxLayout();
	buttonLayout->addWidget(addTaskButton);
	buttonLayout->addWidget(editTaskButton);
	buttonLayout->addWidget(deleteTaskButton);
	buttonLayout->addWidget(startStopButton);

	// 设置主布局
	QVBoxLayout *mainLayout = new QVBoxLayout();
	mainLayout->addWidget(new QLabel(u8"定时任务列表:", this));
	mainLayout->addWidget(taskListWidget);
	mainLayout->addLayout(buttonLayout);

	// 创建中心部件并设置布局
	QWidget *centralWidget = new QWidget(this);
	centralWidget->setLayout(mainLayout);
	setCentralWidget(centralWidget);

	// 添加状态栏
	statusBar()->showMessage(u8"就绪");
}

void MainWindow::on_addTaskButton_clicked()
{
	TaskEditDialog dialog(nullptr, this);
	if (dialog.exec() == QDialog::Accepted) {
		TimerTask task = dialog.getTask();
		if (task.name.isEmpty()) {
			QMessageBox::warning(this, u8"警告", u8"任务名称不能为空!");
			return;
		}
		m_tasks.append(task);
		updateTaskList();
		saveTasks();
	}
}

void MainWindow::on_editTaskButton_clicked()
{
	int currentRow = taskListWidget->currentRow();
	if (currentRow < 0 || currentRow >= m_tasks.size()) {
		QMessageBox::information(this, u8"提示", u8"请先选择一个任务");
		return;
	}

	TaskEditDialog dialog(&m_tasks[currentRow], this);
	if (dialog.exec() == QDialog::Accepted) {
		TimerTask task = dialog.getTask();
		if (task.name.isEmpty()) {
			QMessageBox::warning(this, u8"警告", u8"任务名称不能为空!");
			return;
		}
		m_tasks[currentRow] = task;
		updateTaskList();
		saveTasks();
	}
}

void MainWindow::on_deleteTaskButton_clicked()
{
	int currentRow = taskListWidget->currentRow();
	if (currentRow < 0 || currentRow >= m_tasks.size()) {
		QMessageBox::information(this, u8"提示", u8"请先选择一个任务");
		return;
	}

	if (QMessageBox::question(this, u8"确认", u8"确定要删除选中的任务吗?")
		== QMessageBox::Yes) {
		m_tasks.removeAt(currentRow);
		updateTaskList();
		saveTasks();
	}
}

void MainWindow::on_startStopButton_clicked()
{
	if (m_running) {
		m_checkTimer->stop();
		m_running = false;
		startStopButton->setText(u8"启动监控");
		statusBar()->showMessage(u8"已停止", 2000);
	}
	else {
		m_checkTimer->start();
		m_running = true;
		startStopButton->setText(u8"停止监控");
		statusBar()->showMessage(u8"运行中", 2000);
	}
}

void MainWindow::checkTasks()
{
	QDateTime now = QDateTime::currentDateTime();

	foreach(const TimerTask &task, m_tasks) {
		if (!task.enabled) continue;

		// 计算距离下次运行的时间
		qint64 msecsToNext = getTimeToNextRun(task);

		// 如果小于1秒,触发提示
		if (msecsToNext < 1000) {
			showMessage(task);
		}
	}
}

void MainWindow::showMessage(const TimerTask &task)
{
	QMessageBox msgBox(this);
	msgBox.setWindowTitle(u8"定时提醒");
	msgBox.setText(QString(u8"任务: %1").arg(task.name));
	msgBox.setInformativeText(task.message);
	msgBox.setIcon(QMessageBox::Information);
	msgBox.addButton(QMessageBox::Ok);
	msgBox.exec();
}
// 更新任务列表显示,增加日期信息
void MainWindow::updateTaskList()
{
	taskListWidget->clear();

	foreach(const TimerTask &task, m_tasks) {
		QString status = task.enabled ? u8"启用" : u8"禁用";
		// 显示格式:名称 [状态] - 日期 时间 (间隔: X小时)
		QString itemText = QString(u8"%1 [%2] - %3 %4 (间隔: %5小时)")
			.arg(task.name)
			.arg(status)
			.arg(task.datetime.date().toString("yyyy-MM-dd"))  // 显示日期
			.arg(task.datetime.time().toString("HH:mm:ss"))    // 显示时间
			.arg(task.interval / 3600000.0, 0, 'f', 1);

		taskListWidget->addItem(itemText);
	}
}

void MainWindow::loadTasks()
{
	QFile file("tasks.dat");
	if (file.open(QIODevice::ReadOnly)) {
		QDataStream in(&file);
		in >> m_tasks;
		file.close();
	}
}

void MainWindow::saveTasks()
{
	QFile file("tasks.dat");
	if (file.open(QIODevice::WriteOnly)) {
		QDataStream out(&file);
		out << m_tasks;
		file.close();
	}
}

qint64 MainWindow::getTimeToNextRun(const TimerTask &task)
{
	QDateTime now = QDateTime::currentDateTime();
	QDateTime nextRun = task.datetime;

	// 如果设置的时间在过去,根据间隔计算下次执行时间
	while (nextRun < now) {
		nextRun = nextRun.addMSecs(task.interval);
	}

	return now.msecsTo(nextRun);
}

三、下载连接

https://download.csdn.net/download/u013083044/92232669

相关推荐
浅念-1 小时前
Linux 开发环境与工具链
linux·运维·服务器·数据结构·c++·经验分享
旺仔.2912 小时前
容器适配器:stack栈 、queue队列、priority queue优先级队列、bitset位图 详解
c++
潜创微科技--高清音视频芯片方案开发3 小时前
2026年C转DP芯片方案深度分析:从适配场景到成本性能的优选指南
c语言·开发语言
Thomas.Sir3 小时前
第三章:Python3 之 字符串
开发语言·python·字符串·string
刘景贤3 小时前
C/C++开发环境
开发语言·c++
Dxy12393102164 小时前
Python 根据列表中某字段排序:从基础到进阶
开发语言·windows·python
competes4 小时前
学生需求 交易累计积分,积分兑换奖品
java·大数据·开发语言·人工智能·java-ee
splage4 小时前
Java进阶——IO 流
java·开发语言·python
青桔柠薯片4 小时前
从C语言到裸机运行:i.MX6ULL 的 GPIO 控制与编译链接过程分析
c语言·开发语言·imx6ull