From 61a27c68822efa9229b9ef981089556d66a867e1 Mon Sep 17 00:00:00 2001 From: zzh <838331105@qq.com> Date: Mon, 20 Oct 2025 11:00:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=87=E4=BB=BD=E7=81=AF=E6=9D=A1=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E8=87=AA=E5=AE=9A=E4=B9=89=E5=A4=87=E4=BB=BD=E5=90=8D?= =?UTF-8?q?=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lightstripmanager.cpp | 100 ++++++++++++++++++++++++++++++++++++-- src/lightstripmanager.h | 1 + 2 files changed, 96 insertions(+), 5 deletions(-) diff --git a/src/lightstripmanager.cpp b/src/lightstripmanager.cpp index 27da0eb..8433f06 100644 --- a/src/lightstripmanager.cpp +++ b/src/lightstripmanager.cpp @@ -5,6 +5,8 @@ #include #include #include +#include +#include #include #include // 如果不再需要可以删除: #include @@ -213,7 +215,7 @@ void LightStripManager::setupControlPanel() connect(refreshBtn, &QPushButton::clicked, this, &LightStripManager::onRefreshClicked); // 新增:备份按钮 - backupBtn = new QPushButton("备份列表"); + backupBtn = new QPushButton("备份灯条"); backupBtn->setMinimumHeight(35); backupBtn->setStyleSheet( "QPushButton { " @@ -1040,13 +1042,31 @@ void LightStripManager::onBackupClicked() return; } - // 执行备份 - backupSnList(); - + // 弹出输入框,支持自定义备份文件名 + bool ok = false; + QString inputName = QInputDialog::getText( + this, + "输入备份文件名", + "备份文件名(可留空自动生成):", + QLineEdit::Normal, + "", + &ok + ); + if (!ok) { + return; // 用户取消 + } + + // 执行备份:使用用户输入或自动生成的文件名 + if (inputName.trimmed().isEmpty()) { + backupSnList(); + } else { + createBackupFile(inputName.trimmed()); + } + // 显示备份成功消息 QMessageBox msgBox; msgBox.setWindowTitle("备份完成"); - msgBox.setText(QString("已成功备份 %1 个灯条SN到新文件。\n备份文件保存在应用数据目录的backups文件夹中。").arg(uniqueSnSet.size())); + msgBox.setText(QString("已成功备份 %1 个灯条SN。\n备份文件保存在应用数据目录的backups文件夹中。").arg(uniqueSnSet.size())); msgBox.setIcon(QMessageBox::Information); msgBox.setStyleSheet( "QMessageBox { " @@ -2128,6 +2148,76 @@ QString LightStripManager::generateBackupFileName() const return QString("lightstrip_sn_backup_%1.json").arg(timestamp); } +void LightStripManager::createBackupFile(const QString &fileName) +{ + QString backupDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + "/backups"; + + // 创建备份目录 + QDir dir; + if (!dir.exists(backupDir)) { + if (!dir.mkpath(backupDir)) { + qDebug() << "创建备份目录失败:" << backupDir; + return; + } + } + + QString finalFileName = fileName; + if (finalFileName.trimmed().isEmpty()) { + finalFileName = generateBackupFileName(); + } + if (!finalFileName.endsWith(".json", Qt::CaseInsensitive)) { + finalFileName += ".json"; + } + QString backupFilePath = backupDir + "/" + finalFileName; + + // 若文件已存在,弹出确认是否覆盖 + QFileInfo fi(backupFilePath); + if (fi.exists()) { + QMessageBox::StandardButton reply = QMessageBox::question( + this, + "文件已存在", + QString("备份文件 %1 已存在,是否覆盖?").arg(finalFileName), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::No + ); + if (reply != QMessageBox::Yes) { + qDebug() << "用户取消覆盖,备份中止"; + return; + } + } + + // 创建备份文件内容 + QJsonObject backupData; + backupData["timestamp"] = QDateTime::currentDateTime().toString(Qt::ISODate); + backupData["version"] = "1.0"; + backupData["count"] = uniqueSnSet.size(); + + QJsonArray snArray; + QStringList snList = uniqueSnSet.values(); + for (const QString &sn : snList) { + QJsonObject snObject; + snObject["sn"] = sn; + // 如果有电量信息,也一并备份 + if (batteryInfoMap.contains(sn)) { + snObject["battery"] = batteryInfoMap[sn]; + } + snArray.append(snObject); + } + backupData["lightstrips"] = snArray; + + // 写入文件 + QJsonDocument doc(backupData); + QFile file(backupFilePath); + if (file.open(QIODevice::WriteOnly)) { + file.write(doc.toJson()); + file.close(); + qDebug() << "SN列表备份成功:" << backupFilePath; + qDebug() << "备份了" << uniqueSnSet.size() << "个灯条SN"; + } else { + qDebug() << "创建备份文件失败:" << backupFilePath; + } +} + // 新增:SN列表恢复功能实现 void LightStripManager::restoreSnList() { diff --git a/src/lightstripmanager.h b/src/lightstripmanager.h index e00a35f..bd1e1ed 100644 --- a/src/lightstripmanager.h +++ b/src/lightstripmanager.h @@ -107,6 +107,7 @@ private: // 新增:SN列表备份功能 void backupSnList(); void createBackupFile(); + void createBackupFile(const QString &fileName); QString generateBackupFileName() const; // 新增:SN列表恢复功能