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