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);
}