From a72dbeebbe1b23d76b3d035068e38de899111c9a Mon Sep 17 00:00:00 2001 From: anxinglong <2910824064@qq.com> Date: Thu, 28 May 2026 15:48:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B5=8B=E9=87=8F=E5=88=86?= =?UTF-8?q?=E6=9E=90=E6=A0=91=E6=8E=A7=E4=BB=B6=E7=82=B9=E5=87=BB=E8=BF=9B?= =?UTF-8?q?=E5=85=A5=E8=83=BD=E9=87=8F=E5=88=BB=E5=BA=A6=EF=BC=8C=E8=83=BD?= =?UTF-8?q?=E9=87=8F=E5=88=BB=E5=BA=A6=E5=90=8D=E7=A7=B0=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=A1=AB=E5=86=99=E2=80=9C[=E6=B5=8B=E9=87=8F=E5=88=86?= =?UTF-8?q?=E6=9E=90=E5=90=8D=E7=A7=B0]=E8=83=BD=E9=87=8F=E5=88=BB?= =?UTF-8?q?=E5=BA=A6=EF=BC=8C=E6=B5=8B=E9=87=8F=E5=88=86=E6=9E=90=E6=A0=91?= =?UTF-8?q?=E6=8E=A7=E4=BB=B6=E7=82=B9=E5=87=BB=E8=BF=9B=E5=85=A5=E8=83=BD?= =?UTF-8?q?=E9=87=8F=E5=88=BB=E5=BA=A6=EF=BC=8C=E6=8C=89=E9=92=AE=E2=80=9C?= =?UTF-8?q?=E5=8F=A6=E5=AD=98=E4=B8=BA=E2=80=9D=E6=94=B9=E4=B8=BA=E2=80=9C?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E5=88=B0=E7=B3=BB=E7=BB=9F=E2=80=9D=EF=BC=8C?= =?UTF-8?q?=E7=82=B9=E5=87=BB=E5=90=8E=E5=BC=B9=E5=87=BA=E2=80=9C=E8=83=BD?= =?UTF-8?q?=E9=87=8F=E5=88=BB=E5=BA=A6=E5=90=8D=E7=A7=B0=E2=80=9D=E5=92=8C?= =?UTF-8?q?=E2=80=9C=E5=A4=87=E6=B3=A8=E2=80=9D=E7=BC=96=E8=BE=91=E7=9A=84?= =?UTF-8?q?=E5=AF=B9=E8=AF=9D=E6=A1=86=EF=BC=8C=E7=BC=96=E8=BE=91=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E5=88=B0=E2=80=9Cbin/configure=E2=80=9D=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=EF=BC=8C=E6=89=80=E6=9C=89=E7=9A=84=E8=83=BD=E9=87=8F?= =?UTF-8?q?=E5=88=BB=E5=BA=A6=E7=BC=96=E8=BE=91=E7=95=8C=E9=9D=A2=E4=B8=AD?= =?UTF-8?q?=EF=BC=8C=E8=83=BD=E9=87=8F=E5=88=BB=E5=BA=A6=E6=8B=9F=E5=90=88?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=A1=A8=E7=BC=96=E8=BE=91=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=90=8E=EF=BC=8C=E8=A6=81=E6=B1=82=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E6=8B=9F=E5=90=88=EF=BC=8C=E4=B8=89=E7=BB=B4=E7=AC=A6?= =?UTF-8?q?=E5=90=88=E8=83=BD=E8=B0=B1=E7=9A=84=E7=95=8C=E9=9D=A2=E4=B8=AD?= =?UTF-8?q?=E4=B8=89=E7=BB=B4=E5=9B=BE=E8=A1=A8=E6=B7=BB=E5=8A=A0=E5=9B=BE?= =?UTF-8?q?=E8=A1=A8=E5=90=84=E8=BD=B4=E7=9A=84=E5=90=8D=E7=A7=B0label?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/EnergyScaleForm.cpp | 154 ++++++++++++++---- src/EnergyScaleForm.h | 2 + src/EnergyScaleForm.ui | 18 +- .../ThreeDDisplay.cpp | 16 +- 4 files changed, 155 insertions(+), 35 deletions(-) diff --git a/src/EnergyScaleForm.cpp b/src/EnergyScaleForm.cpp index 1dedeef..a280bdf 100644 --- a/src/EnergyScaleForm.cpp +++ b/src/EnergyScaleForm.cpp @@ -61,11 +61,15 @@ void EnergyScaleForm::SetAnalyzeDataFilename(const QMap &data if (!data_files_set.isEmpty()) { const QString& data_name = data_files_set.firstKey(); const QString& data_filename = data_files_set.first().toString(); + QFileInfo info(data_filename); + QDir dir = info.dir(); if (QFileInfo(data_filename).exists()) { ui->groupBox_3->hide(); QFileInfo fileInfo(data_filename); - QString baseName = fileInfo.baseName(); + QString baseName =QString("[%1]%2").arg(dir.dirName()).arg(fileInfo.baseName()); ui->lineEdit_name->setText(baseName); + ui->lineEdit_name->setReadOnly(true); + ui->pBtn_SaveAs->setText(QStringLiteral(u"保存到系统")); m_currentFilePath = data_filename; QString errorMsg; m_channelList = parseJsonToChannels(data_filename, errorMsg); @@ -461,6 +465,7 @@ bool EnergyScaleForm::fitFwhmModel(ChannelData &chData) } arma::vec E(E_list.data(), E_list.size()); arma::vec FWHM(fwhm_list.data(), fwhm_list.size()); + arma::vec params = NolinearLeastSquaresCurveFit::Lsqcurvefit(FwhmModel,E,FWHM, { 1.0, 1.0 }); chData.fwhmFitResultCoeffs.clear(); chData.fwhmFitResultCoeffs.append(params(0)); // k @@ -474,8 +479,11 @@ bool EnergyScaleForm::saveChannelDataToJson(const QString &filePath) if (filePath.isEmpty()) return false; QJsonObject rootObj; - - QString remark = ui->plainTextEdit_description->toPlainText().trimmed(); + QString remark; + if(systemEnble) + remark = ui->plainTextEdit_description->property("systemData").toString(); + else + remark = ui->plainTextEdit_description->toPlainText().trimmed(); rootObj["Remark"] = remark; for (auto it = m_channelList.begin(); it != m_channelList.end(); ++it) { @@ -838,7 +846,6 @@ void EnergyScaleForm::on_tablew_scale_data_cellChanged(int row, int column) return; } - // 只同步道址和能量列的修改 bool needRecalc = false; if (column == 0) { // 检查道址重复 @@ -860,45 +867,134 @@ void EnergyScaleForm::on_tablew_scale_data_cellChanged(int row, int column) } if (needRecalc) { - calculateFitValues(chData); - m_isLoadingTable = true; - showChannelData(channelName); - m_isLoadingTable = false; - showCurve(); + // calculateFitValues(chData); + // m_isLoadingTable = true; + // showChannelData(channelName); + // m_isLoadingTable = false; + // showCurve(); + on_pBtn_fitting_clicked(); } + } void EnergyScaleForm::on_pBtn_SaveAs_clicked() { - // 选择保存路径 - QString defaultDir = QDir(qApp->applicationDirPath()).filePath("configure/EnergyScale"); - QString filePath = QFileDialog::getSaveFileName(this, - "另存为能量刻度文件", - defaultDir, - "JSON文件 (*.json);;所有文件 (*.*)"); + QString SaveAsName = ui->pBtn_SaveAs->text(); + QString targetFilePath; + QString fileName; + QString remark; + if(SaveAsName.contains("保存到系统")) + { + systemEnble = true; + QDialog dialog(this); + dialog.setWindowTitle(QStringLiteral(u"保存到系统 - 能量刻度配置")); + dialog.setFixedSize(400, 250); + dialog.setModal(true); - if (filePath.isEmpty()) { - return; + QVBoxLayout* mainLayout = new QVBoxLayout(&dialog); + mainLayout->setSpacing(15); + mainLayout->setContentsMargins(20, 20, 20, 20); + + QHBoxLayout* nameLayout = new QHBoxLayout(); + QLabel* nameLabel = new QLabel(QStringLiteral(u"能量刻度名称:")); + QLineEdit* nameEdit = new QLineEdit(); + nameEdit->setPlaceholderText(QStringLiteral(u"请输入刻度名称:")); + + if (!ui->lineEdit_name->text().isEmpty()) { + QString baseName = ui->lineEdit_name->text(); + baseName = baseName.contains("[") ? baseName.split("]").last().trimmed() : baseName; + nameEdit->setText(baseName); + } + nameLayout->addWidget(nameLabel); + nameLayout->addWidget(nameEdit); + + // 备注输入框 + QVBoxLayout* remarkLayout = new QVBoxLayout(); + QLabel* remarkLabel = new QLabel(QStringLiteral(u"备注:")); + QTextEdit* remarkEdit = new QTextEdit(); + remarkEdit->setPlaceholderText(QStringLiteral(u"请输入备注信息(可选)")); + remarkEdit->setPlainText(ui->plainTextEdit_description->toPlainText()); // 填充现有备注 + remarkLayout->addWidget(remarkLabel); + remarkLayout->addWidget(remarkEdit); + + // 按钮组 + QHBoxLayout* btnLayout = new QHBoxLayout(); + QPushButton* okBtn = new QPushButton(QStringLiteral(u"保存")); + QPushButton* cancelBtn = new QPushButton(QStringLiteral(u"取消")); + okBtn->setDefault(true); + btnLayout->addStretch(); + btnLayout->addWidget(okBtn); + btnLayout->addWidget(cancelBtn); + + // 组装布局 + mainLayout->addLayout(nameLayout); + mainLayout->addLayout(remarkLayout); + mainLayout->addLayout(btnLayout); + + connect(okBtn, &QPushButton::clicked, &dialog, &QDialog::accept); + connect(cancelBtn, &QPushButton::clicked, &dialog, &QDialog::reject); + + if (dialog.exec() != QDialog::Accepted) { + return; + } + + fileName = nameEdit->text().trimmed(); + remark = remarkEdit->toPlainText().trimmed(); + if (fileName.isEmpty()) { + QMessageBox::warning(this, QStringLiteral(u"输入错误"), QStringLiteral(u"能量刻度名称不能为空!")); + return; + } + QString defaultDir = QDir(qApp->applicationDirPath()).filePath("configure/EnergyScale"); + + QDir dir(defaultDir); + if (!dir.exists() && !dir.mkpath(".")) { + QMessageBox::critical(this, QStringLiteral(u"错误"), QStringLiteral(u"无法创建目录:%1").arg(defaultDir)); + return; + } + targetFilePath = dir.filePath(fileName + ".json"); // 强制.json后缀 + + if (QFile::exists(targetFilePath)) { + QMessageBox::StandardButton ret = QMessageBox::question( + this, + QStringLiteral(u"文件已存在"), + QStringLiteral(u"名称为“%1”的能量刻度文件已存在,是否覆盖?").arg(fileName), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::No + ); + if (ret != QMessageBox::Yes) { + return; + } + } + ui->plainTextEdit_description->setProperty("systemData",remark); + }else{ + systemEnble = false; + // 选择保存路径 + QString defaultDir = QDir(qApp->applicationDirPath()).filePath("configure/EnergyScale"); + QString targetFilePath = QFileDialog::getSaveFileName(this, + "另存为能量刻度文件", + defaultDir, + "JSON文件 (*.json);;所有文件 (*.*)"); + + if (targetFilePath.isEmpty()) { + return; + } + + // 确保后缀是.json + if (!targetFilePath.endsWith(".json", Qt::CaseInsensitive)) { + targetFilePath += ".json"; + } } - - // 确保后缀是.json - if (!filePath.endsWith(".json", Qt::CaseInsensitive)) { - filePath += ".json"; - } - // 保存文件 - if (saveChannelDataToJson(filePath)) { - m_currentFilePath = filePath; // 更新当前文件路径 - ui->lineEdit_name->setText(QFileInfo(filePath).baseName()); + if (saveChannelDataToJson(targetFilePath)) { + // m_currentFilePath = targetFilePath; // 更新当前文件路径 + // ui->lineEdit_name->setText(QFileInfo(targetFilePath).baseName()); loadAllFilesInTheFolder(); - QMessageBox::information(this, "成功", "文件另存为成功"); - } else { - QMessageBox::critical(this, "失败", "文件另存为失败"); } } void EnergyScaleForm::on_pBtn_Save_clicked() { + systemEnble = false; if (saveChannelDataToJson(m_currentFilePath)) { QMessageBox::information(this, "成功", "数据保存成功"); } else { diff --git a/src/EnergyScaleForm.h b/src/EnergyScaleForm.h index 6c78953..f7c7b90 100644 --- a/src/EnergyScaleForm.h +++ b/src/EnergyScaleForm.h @@ -100,6 +100,8 @@ private: //记录当前加载的文件路径 QString m_currentFilePath; + bool systemEnble = false; + }; #endif // ENERGYSCALEFORM_H diff --git a/src/EnergyScaleForm.ui b/src/EnergyScaleForm.ui index fc1274b..d5fdb23 100644 --- a/src/EnergyScaleForm.ui +++ b/src/EnergyScaleForm.ui @@ -6,8 +6,8 @@ 0 0 - 1086 - 584 + 1920 + 1080 @@ -65,7 +65,7 @@ - + @@ -214,6 +214,12 @@ + + + 287 + 0 + + y = a + bx @@ -221,6 +227,12 @@ + + + 287 + 0 + + a = 1.21823, b = -5.0542 diff --git a/src/ThreeDimensionalConformityAnalysisView/ThreeDDisplay.cpp b/src/ThreeDimensionalConformityAnalysisView/ThreeDDisplay.cpp index 7975c63..e3f1afd 100644 --- a/src/ThreeDimensionalConformityAnalysisView/ThreeDDisplay.cpp +++ b/src/ThreeDimensionalConformityAnalysisView/ThreeDDisplay.cpp @@ -70,10 +70,20 @@ void ThreeDDisplay::_init3DSurface() ui->hLayout3D->setContentsMargins(0, 0, 0, 0); // 设置轴标签和标题 - m_surface->axisX()->setTitle("初级粒子能量 (MeV)"); - m_surface->axisY()->setTitle("符合事件计数"); - m_surface->axisZ()->setTitle("次级粒子能量和 (MeV)"); + m_surface->axisX()->setTitle("初级粒子能量 (KeV)"); + m_surface->axisX()->setTitleVisible(true); // 关键:启用标题显示 + m_surface->axisX()->setLabelFormat("%.1f"); // 刻度标签格式 + m_surface->axisX()->setLabelAutoRotation(30); // 标签自动旋转避免重叠 + m_surface->axisY()->setTitle("符合事件计数"); + m_surface->axisY()->setTitleVisible(true); + m_surface->axisY()->setLabelFormat("%.0f"); // 整数格式 + m_surface->axisY()->setLabelAutoRotation(30); + + m_surface->axisZ()->setTitle("次级粒子能量和 (KeV)"); + m_surface->axisZ()->setTitleVisible(true); + m_surface->axisZ()->setLabelFormat("%.1f"); + m_surface->axisZ()->setLabelAutoRotation(30); // 创建自定义主题(或者修改当前主题) Q3DTheme *customTheme = m_surface->activeTheme(); customTheme->setType(Q3DTheme::ThemeQt); // 使用Qt主题为基础