From 3a8825beb9e2853144aea45cfba58b5eac281ffa Mon Sep 17 00:00:00 2001 From: anxinglong <2910824064@qq.com> Date: Tue, 19 May 2026 18:21:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=8C=E7=BB=B4=E7=AC=A6=E5=90=88=E8=83=BD?= =?UTF-8?q?=E8=B0=B1=E6=88=90=E5=91=98=E5=8F=98=E9=87=8F=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=BC=98=E5=8C=96=EF=BC=8C=E4=BA=8C=E7=BB=B4?= =?UTF-8?q?=E7=AC=A6=E5=90=88=E8=83=BD=E8=B0=B1=E6=A1=86=E9=80=89=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F=E6=98=BE=E7=A4=BA=E7=BB=9F=E8=AE=A1=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=EF=BC=8C=E4=BA=8C=E7=BB=B4=E7=AC=A6=E5=90=88=E8=83=BD=E8=B0=B1?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8F=B3=E9=94=AE=E8=8F=9C=E5=8D=95=E8=BF=98?= =?UTF-8?q?=E5=8E=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TwoDSpectralCompliance.cpp | 217 ++++++++++++++---- .../TwoDSpectralCompliance.h | 45 +++- src/NuclideLib/NuclideEditDialog.cpp | 10 +- src/NuclideLib/NuclideRayDialog.cpp | 14 +- 4 files changed, 223 insertions(+), 63 deletions(-) diff --git a/src/2DSpectralCompliance/TwoDSpectralCompliance.cpp b/src/2DSpectralCompliance/TwoDSpectralCompliance.cpp index 2fc45a2..8a7db2b 100644 --- a/src/2DSpectralCompliance/TwoDSpectralCompliance.cpp +++ b/src/2DSpectralCompliance/TwoDSpectralCompliance.cpp @@ -19,8 +19,11 @@ #include #include #include +#include #include +#include #include +#include #include #include #include @@ -45,6 +48,8 @@ TwoDSpectralCompliance::TwoDSpectralCompliance(QWidget* parent) , ui(new Ui::TwoDSpectralCompliance) { ui->setupUi(this); + this->_menu = new QMenu(this); + setupMenu(); QHBoxLayout* layout = new QHBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); this->_plot = new CustomQwtPlot(this); @@ -79,8 +84,8 @@ void TwoDSpectralCompliance::SetAnalyzeDataFilename(const QMapStart(); auto functionToRun = [this, _data_filenames]() { - readCsv(_data_filenames); - generateSurfaceData(); + QVector rawData = readCsv(_data_filenames); + generateSurfaceData(rawData); QMetaObject::invokeMethod(this, [this]() { updateSpectrogram(); _busy_indicator->Stop(); @@ -122,15 +127,45 @@ void TwoDSpectralCompliance::setupPlot() _spectrogram = new QwtPlotSpectrogram(); _spectrogram->setColorMap(new HeatMapColorMap()); _spectrogram->attach(_plot); + + _picker = new QwtPlotPicker( + QwtPlot::xBottom, // X 轴 + QwtPlot::yLeft, // Y 轴 + QwtPicker::RectRubberBand, // 橡皮筋样式 + QwtPicker::AlwaysOff, // 不显示坐标追踪 + _plot->canvas() // 作用于画布 + ); + QwtPickerDragRectMachine* rectMachine = new QwtPickerDragRectMachine(); + _picker->setStateMachine(rectMachine); + connect(_picker, SIGNAL(selected(const QRectF&)), + this, SLOT(onSelection(const QRectF&))); } -void TwoDSpectralCompliance::readCsv(const QStringList& filename) +void TwoDSpectralCompliance::setupMenu() { + this->setContextMenuPolicy(Qt::CustomContextMenu); + connect(this, &TwoDSpectralCompliance::customContextMenuRequested, [this](const QPoint& pos) { + this->_menu->exec(this->mapToGlobal(pos)); + }); + QAction* action_plot_reset = this->_menu->addAction(QStringLiteral(u"还原")); + action_plot_reset->setObjectName("plot_reset"); + connect(action_plot_reset, &QAction::triggered, [this]() { + this->_plot->ResetPlot(); + }); + this->_menu->addSeparator(); + QAction* action_plot_config = this->_menu->addAction(QStringLiteral(u"图表配置")); + action_plot_config->setObjectName("plot_config"); + connect(action_plot_config, &QAction::triggered, this, &TwoDSpectralCompliance::onActionPlotConfigure); +} + +QVector TwoDSpectralCompliance::readCsv(const QStringList& filename) +{ + QVector rawData; if (filename.isEmpty()) { QMetaObject::invokeMethod(this, [this]() { _busy_indicator->Stop(); }, Qt::QueuedConnection); - return; + return rawData; } for (const QString& filename : filename) { io::CSVReader<5> in(QStrToSysPath(filename)); @@ -140,29 +175,31 @@ void TwoDSpectralCompliance::readCsv(const QStringList& filename) QString(QStringLiteral(u"通道号")).toStdString(), QString(QStringLiteral(u"能量(KeV)")).toStdString(), QString(QStringLiteral(u"时间计数")).toStdString()); - int eventId,board, channel; + int eventId, board, channel; double energy; unsigned long long time_count; - while (in.read_row(eventId,board, channel, energy, time_count)) { + while (in.read_row(eventId, board, channel, energy, time_count)) { EventData sd; sd.eventId = eventId; sd.board = board; sd.channel = channel; sd.energy = energy; sd.timeCounter = time_count; - m_rawData.push_back(sd); + rawData.push_back(sd); } } + return rawData; } -void TwoDSpectralCompliance::generateSurfaceData() +void TwoDSpectralCompliance::generateSurfaceData(QVector rawData) { m_surfaceData.clear(); - if (m_rawData.isEmpty()) + m_eventSummaries.clear(); + if (rawData.isEmpty()) return; QMap> eventMap; - for (const auto& ev : m_rawData) { + for (const auto& ev : rawData) { eventMap[ev.eventId].append(ev); } @@ -179,6 +216,12 @@ void TwoDSpectralCompliance::generateSurfaceData() secondarySum += events[i].energy; } + EventSummary summary; + summary.eventId = it.key(); + summary.primaryEnergy = primaryEnergy; + summary.secondaryEnergySum = secondarySum; + m_eventSummaries.append(summary); + auto key = qMakePair(primaryEnergy, secondarySum); countMap[key]++; } @@ -242,17 +285,23 @@ void TwoDSpectralCompliance::updateSpectrogram() QwtMatrixRasterData* data = new QwtMatrixRasterData(); data->setInterval(Qt::XAxis, QwtInterval(primStart, primEnd)); data->setInterval(Qt::YAxis, QwtInterval(secStart, secEnd)); + _plot->SetAxisInitRange(QwtPlot::xBottom, primStart, primEnd); + _plot->SetAxisInitRange(QwtPlot::yLeft, secStart, secEnd); data->setInterval(Qt::ZAxis, QwtInterval(0, maxCount)); data->setValueMatrix(zValues, numCols); _spectrogram->setData(data); _plot->setAxisScale(QwtPlot::xBottom, primStart, primEnd); _plot->setAxisScale(QwtPlot::yLeft, secStart, secEnd); + m_globalXMin = primStart; + m_globalXMax = primEnd; + m_globalYMin = secStart; + m_globalYMax = secEnd; _plot->replot(); } + void TwoDSpectralCompliance::createFloatingInfoWidget() { - // 悬浮窗口 m_floatingWidget = new QWidget(this); m_floatingWidget->setObjectName("FloatingInfoWidget"); m_floatingWidget->setStyleSheet( @@ -268,7 +317,7 @@ void TwoDSpectralCompliance::createFloatingInfoWidget() mainLayout->setSpacing(5); mainLayout->setContentsMargins(8, 8, 8, 8); - // 标题栏(可拖动,并包含隐藏按钮) + // 标题栏(可拖动,包含重置和隐藏按钮) QWidget* titleBar = new QWidget(); QHBoxLayout* titleLayout = new QHBoxLayout(titleBar); titleLayout->setContentsMargins(0, 0, 0, 0); @@ -276,9 +325,17 @@ void TwoDSpectralCompliance::createFloatingInfoWidget() titleLabel->setStyleSheet("font-weight: bold;"); titleLayout->addWidget(titleLabel); titleLayout->addStretch(); - QPushButton* hideBtn = new QPushButton(QStringLiteral("−")); + + // 重置按钮:清除选区,显示全局统计 + QPushButton* resetBtn = new QPushButton("重置"); + resetBtn->setFixedSize(40, 20); + resetBtn->setToolTip(QStringLiteral(u"显示全局统计")); + resetBtn->setStyleSheet("border: none; font-weight: bold;"); + titleLayout->addWidget(resetBtn); + + // 隐藏按钮 + QPushButton* hideBtn = new QPushButton(QStringLiteral("X")); hideBtn->setFixedSize(20, 20); - hideBtn->setText(QStringLiteral(u"X")); hideBtn->setStyleSheet("border: none; font-weight: bold;"); titleLayout->addWidget(hideBtn); mainLayout->addWidget(titleBar); @@ -295,6 +352,7 @@ void TwoDSpectralCompliance::createFloatingInfoWidget() m_totalPointsEdit = new QLineEdit; m_totalPointsEdit->setReadOnly(true); m_totalPointsEdit->setFixedWidth(130); + m_maxCountEdit = new QLineEdit; m_maxCountEdit->setReadOnly(true); m_maxCountEdit->setFixedWidth(130); @@ -307,7 +365,7 @@ void TwoDSpectralCompliance::createFloatingInfoWidget() m_secRangeEdit->setReadOnly(true); m_secRangeEdit->setFixedWidth(130); - formLayout->addRow(QStringLiteral(u"总事件数:"), m_totalEventsEdit); + formLayout->addRow(QStringLiteral(u"符合事件数:"), m_totalEventsEdit); formLayout->addRow(QStringLiteral(u"有效数据点:"), m_totalPointsEdit); formLayout->addRow(QStringLiteral(u"最大计数:"), m_maxCountEdit); formLayout->addRow(QStringLiteral(u"初级能量范围:"), m_primRangeEdit); @@ -317,6 +375,10 @@ void TwoDSpectralCompliance::createFloatingInfoWidget() mainLayout->addStretch(); connect(hideBtn, &QPushButton::clicked, this, &TwoDSpectralCompliance::hideFloatingWidget); + connect(resetBtn, &QPushButton::clicked, this, [this]() { + m_hasSelection = false; + updateInfoContent(); + }); titleBar->setCursor(Qt::SizeAllCursor); m_floatingWidget->installEventFilter(this); @@ -340,7 +402,6 @@ void TwoDSpectralCompliance::createFloatingInfoWidget() m_floatingWidget->hide(); m_showButton->show(); - // m_floatingWidget->raise(); updateInfoContent(); } @@ -356,7 +417,7 @@ void TwoDSpectralCompliance::showFloatingWidget() m_floatingWidget->show(); m_floatingWidget->raise(); m_showButton->hide(); - updateInfoContent(); // 刷新内容 + updateInfoContent(); } void TwoDSpectralCompliance::updateShowButtonPosition() @@ -366,7 +427,45 @@ void TwoDSpectralCompliance::updateShowButtonPosition() } } -void TwoDSpectralCompliance::updateInfoContent() +void TwoDSpectralCompliance::onSelection(const QRectF& rect) +{ + // 忽略过小的选区(可能是误点击) + if (rect.width() < 5 || rect.height() < 5) + return; + + // 将画布像素矩形转换为轴坐标 + const QwtScaleMap xMap = _plot->canvasMap(QwtPlot::xBottom); + const QwtScaleMap yMap = _plot->canvasMap(QwtPlot::yLeft); + // qDebug()<<"左边:" << rect.left() << "右边:" << rect.right()<< "上边:" << rect.top()<< "下边:" << rect.bottom(); + // double x1 = xMap.invTransform(rect.left()); + // double x2 = xMap.invTransform(rect.right()); + // double y1 = yMap.invTransform(rect.bottom()); // 注意画布Y轴方向 + // double y2 = yMap.invTransform(rect.top()); + + + double x1 = rect.left(); + double x2 = rect.right(); + double y1 = rect.bottom(); + double y2 = rect.top(); + m_selXMin = std::min(x1, x2); + m_selXMax = std::max(x1, x2); + m_selYMin = std::min(y1, y2); + m_selYMax = std::max(y1, y2); + + _plot->setAxisScale(QwtPlot::xBottom, m_selXMin, m_selXMax); + _plot->setAxisScale(QwtPlot::yLeft, m_selYMin, m_selYMax); + _plot->replot(); + + m_hasSelection = true; + updateInfoContent(); +} + +void TwoDSpectralCompliance::onActionPlotConfigure() +{ + +} + +void TwoDSpectralCompliance:: updateInfoContent() { if (!m_totalEventsEdit) return; @@ -380,29 +479,66 @@ void TwoDSpectralCompliance::updateInfoContent() return; } - int totalPoints = m_surfaceData.size(); - int maxCount = 0; - float minPrim = 1e9f, maxPrim = -1e9f; - float minSec = 1e9f, maxSec = -1e9f; - for (const auto& pt : m_surfaceData) { - minPrim = std::min(minPrim, pt.primaryEnergy); - maxPrim = std::max(maxPrim, pt.primaryEnergy); - minSec = std::min(minSec, pt.secondaryEnergySum); - maxSec = std::max(maxSec, pt.secondaryEnergySum); - maxCount = std::max(maxCount, pt.count); - } + if (m_hasSelection) { + // ----- 框选区域统计(基于热图数据点 m_surfaceData)----- + int totalEvents = 0; // 总事件数 = 区域内所有点的计数值之和 + int totalPoints = 0; + int maxCount = 0; + float minPrim = 1e9f, maxPrim = -1e9f; + float minSec = 1e9f, maxSec = -1e9f; - QSet eventIds; - for (const auto& ev : m_rawData) { - eventIds.insert(ev.eventId); - } - int totalEvents = eventIds.size(); + for (const auto& pt : m_surfaceData) { + if (pt.primaryEnergy >= m_selXMin && pt.primaryEnergy <= m_selXMax && + pt.secondaryEnergySum >= m_selYMin && pt.secondaryEnergySum <= m_selYMax) { - m_totalEventsEdit->setText(QString::number(totalEvents)); - m_totalPointsEdit->setText(QString::number(totalPoints)); - m_maxCountEdit->setText(QString::number(maxCount)); - m_primRangeEdit->setText(QString("[%1, %2]").arg(minPrim, 0, 'f', 2).arg(maxPrim, 0, 'f', 2)); - m_secRangeEdit->setText(QString("[%1, %2]").arg(minSec, 0, 'f', 2).arg(maxSec, 0, 'f', 2)); + totalPoints++; + totalEvents += pt.count; + maxCount = std::max(maxCount, pt.count); + + minPrim = std::min(minPrim, pt.primaryEnergy); + maxPrim = std::max(maxPrim, pt.primaryEnergy); + minSec = std::min(minSec, pt.secondaryEnergySum); + maxSec = std::max(maxSec, pt.secondaryEnergySum); + } + } + + if (totalPoints == 0) { + m_totalEventsEdit->setText(QStringLiteral(u"0")); + m_totalPointsEdit->setText(QStringLiteral(u"0")); + m_maxCountEdit->setText(QStringLiteral(u"0")); + m_primRangeEdit->setText(QStringLiteral(u"无数据")); + m_secRangeEdit->setText(QStringLiteral(u"无数据")); + return; + } + + m_totalEventsEdit->setText(QString::number(totalEvents)); + m_totalPointsEdit->setText(QString::number(totalPoints)); + m_maxCountEdit->setText(QString::number(maxCount)); + m_primRangeEdit->setText(QString("[%1, %2]").arg(minPrim, 0, 'f', 2).arg(maxPrim, 0, 'f', 2)); + m_secRangeEdit->setText(QString("[%1, %2]").arg(minSec, 0, 'f', 2).arg(maxSec, 0, 'f', 2)); + } else { + // ----- 全局统计(无选区时)----- + int totalPoints = m_surfaceData.size(); + int totalEvents = 0; + int maxCount = 0; + float minPrim = 1e9f, maxPrim = -1e9f; + float minSec = 1e9f, maxSec = -1e9f; + + for (const auto& pt : m_surfaceData) { + totalEvents += pt.count; + minPrim = std::min(minPrim, pt.primaryEnergy); + maxPrim = std::max(maxPrim, pt.primaryEnergy); + minSec = std::min(minSec, pt.secondaryEnergySum); + maxSec = std::max(maxSec, pt.secondaryEnergySum); + maxCount = std::max(maxCount, pt.count); + } + + m_totalEventsEdit->setText(QString::number(totalEvents)); + m_totalPointsEdit->setText(QString::number(totalPoints)); + m_maxCountEdit->setText(QString::number(maxCount)); + m_primRangeEdit->setText(QString("[%1, %2]").arg(minPrim, 0, 'f', 2).arg(maxPrim, 0, 'f', 2)); + m_secRangeEdit->setText(QString("[%1, %2]").arg(minSec, 0, 'f', 2).arg(maxSec, 0, 'f', 2)); + } } void TwoDSpectralCompliance::resizeEvent(QResizeEvent* event) @@ -410,7 +546,6 @@ void TwoDSpectralCompliance::resizeEvent(QResizeEvent* event) QWidget::resizeEvent(event); updateShowButtonPosition(); if (m_floatingWidget && m_floatingWidget->isVisible()) { - // 限制悬浮窗口不超出父窗口边界 QRect rect = m_floatingWidget->geometry(); int newX = qBound(0, rect.x(), width() - rect.width()); int newY = qBound(0, rect.y(), height() - rect.height()); @@ -456,4 +591,4 @@ void TwoDSpectralCompliance::showEvent(QShowEvent* e) _busy_indicator->setGeometry(this->rect()); this->update(); } -} +} \ No newline at end of file diff --git a/src/2DSpectralCompliance/TwoDSpectralCompliance.h b/src/2DSpectralCompliance/TwoDSpectralCompliance.h index d3bd3ff..4f9c267 100644 --- a/src/2DSpectralCompliance/TwoDSpectralCompliance.h +++ b/src/2DSpectralCompliance/TwoDSpectralCompliance.h @@ -5,9 +5,10 @@ #include #include #include - +#include class CustomQwtPlot; class QwtPlotSpectrogram; +class QwtPlotPicker; class QPushButton; class QLineEdit; class ScatterPlotItem; @@ -22,6 +23,14 @@ struct TwoSurfacePoint { int count; }; +struct EventData { + int eventId; + int board; + int channel; + double energy; + unsigned long long timeCounter; +}; + class TwoDSpectralCompliance : public MeasureAnalysisView { Q_OBJECT @@ -39,8 +48,9 @@ protected: private: void setupPlot(); - void readCsv(const QStringList& filename); - void generateSurfaceData(); + void setupMenu(); + QVector readCsv(const QStringList& filename); + void generateSurfaceData(QVector rawData); void updateSpectrogram(); void createFloatingInfoWidget(); @@ -53,21 +63,32 @@ private: private slots: void showFloatingWidget(); void hideFloatingWidget(); + void onSelection(const QRectF& rect); + void onActionPlotConfigure(); private: Ui::TwoDSpectralCompliance* ui; + QMenu* _menu = nullptr; CustomQwtPlot* _plot = nullptr; QwtPlotSpectrogram* _spectrogram = nullptr; + QwtPlotPicker* _picker = nullptr; - struct EventData { + + + struct EventSummary { int eventId; - int board; - int channel; - double energy; - unsigned long long timeCounter; + float primaryEnergy; + float secondaryEnergySum; }; - QVector m_rawData; + + // QVector m_rawData; QVector m_surfaceData; + QVector m_eventSummaries; + + // 框选区域 + bool m_hasSelection = false; + double m_selXMin = 0.0, m_selXMax = 0.0; + double m_selYMin = 0.0, m_selYMax = 0.0; QWidget* m_floatingWidget = nullptr; QPushButton* m_toggleButton = nullptr; @@ -82,6 +103,10 @@ private: QPoint m_dragPosition; bool m_dragging = false; BusyIndicator* _busy_indicator = nullptr; + + // 保存全局轴范围(用于重置放大) + double m_globalXMin = 0.0, m_globalXMax = 0.0; + double m_globalYMin = 0.0, m_globalYMax = 0.0; }; -#endif // TWODSPECTRALCOMPLIANCE_H +#endif // TWODSPECTRALCOMPLIANCE_H \ No newline at end of file diff --git a/src/NuclideLib/NuclideEditDialog.cpp b/src/NuclideLib/NuclideEditDialog.cpp index cedfc93..0757c46 100644 --- a/src/NuclideLib/NuclideEditDialog.cpp +++ b/src/NuclideLib/NuclideEditDialog.cpp @@ -33,11 +33,11 @@ void NuclideEditDialog::initUI() m_leChildNuclide = new QLineEdit(this); // 设置表单项(标签不变,用户界面无感知) - formLayout->addRow("核素名称", m_leName); - formLayout->addRow("半衰期", m_leHalfLife); - formLayout->addRow("半衰期不确定度", m_leHalfLifeUnc); - formLayout->addRow("母体核素名称", m_leParentNuclide); - formLayout->addRow("子体核素名称", m_leChildNuclide); + formLayout->addRow("核素名称:", m_leName); + formLayout->addRow("半衰期:", m_leHalfLife); + formLayout->addRow("半衰期不确定度:", m_leHalfLifeUnc); + formLayout->addRow("母体核素名称:", m_leParentNuclide); + formLayout->addRow("子体核素名称:", m_leChildNuclide); // 按钮盒 QDialogButtonBox *btnBox = new QDialogButtonBox( diff --git a/src/NuclideLib/NuclideRayDialog.cpp b/src/NuclideLib/NuclideRayDialog.cpp index 63581a2..25370bc 100644 --- a/src/NuclideLib/NuclideRayDialog.cpp +++ b/src/NuclideLib/NuclideRayDialog.cpp @@ -31,32 +31,32 @@ void NuclideRayDialog::initUI() // 射线类型下拉框(常用核素射线类型) m_cmbRayType = new QComboBox(this); m_cmbRayType->addItems({QStringLiteral(u"γ"), QStringLiteral(u"β⁻"), QStringLiteral(u"β⁺"), QStringLiteral(u"α"), QStringLiteral(u"X射线"), QStringLiteral(u"中子"), QStringLiteral(u"电子俘获")}); - formLayout->addRow(QStringLiteral(u"射线类型"), m_cmbRayType); + formLayout->addRow(QStringLiteral(u"射线类型:"), m_cmbRayType); m_leRayMev = new QLineEdit(this); m_leRayMev->setPlaceholderText(QStringLiteral(u"例如:1.332 MeV")); - formLayout->addRow(QStringLiteral(u"射线能量"), m_leRayMev); + formLayout->addRow(QStringLiteral(u"射线能量:"), m_leRayMev); m_leRayMevUnc = new QLineEdit(this); m_leRayMevUnc->setPlaceholderText(QStringLiteral(u"例如:0.001 MeV")); - formLayout->addRow(QStringLiteral(u"能量不确定度"), m_leRayMevUnc); + formLayout->addRow(QStringLiteral(u"能量不确定度:"), m_leRayMevUnc); m_leBranchRatio = new QLineEdit(this); m_leBranchRatio->setPlaceholderText(QStringLiteral(u"例如:0.9998")); - formLayout->addRow("分支比", m_leBranchRatio); + formLayout->addRow("分支比:", m_leBranchRatio); m_leBranchRatioUnc = new QLineEdit(this); m_leBranchRatioUnc->setPlaceholderText(QStringLiteral(u"例如:0.0001")); - formLayout->addRow(QStringLiteral(u"分支比不确定度"), m_leBranchRatioUnc); + formLayout->addRow(QStringLiteral(u"分支比不确定度:"), m_leBranchRatioUnc); // 主射线标识下拉框 m_cmbMainRayIdent = new QComboBox(this); m_cmbMainRayIdent->addItems({QStringLiteral(u"是"), QStringLiteral(u"否")}); - formLayout->addRow(QStringLiteral(u"是否为主射线"), m_cmbMainRayIdent); + formLayout->addRow(QStringLiteral(u"是否为主射线:"), m_cmbMainRayIdent); m_leJiahePeak = new QLineEdit(this); m_leJiahePeak->setPlaceholderText(QStringLiteral(u"无则留空")); - formLayout->addRow(QStringLiteral(u"加和峰"), m_leJiahePeak); + formLayout->addRow(QStringLiteral(u"加和峰:"), m_leJiahePeak); // 按钮盒 QDialogButtonBox *btnBox = new QDialogButtonBox(