From ea1af96909cd7c16768dca4f416f2fd45b51854c Mon Sep 17 00:00:00 2001 From: lvjunjie Date: Thu, 29 Oct 2026 11:17:40 +0800 Subject: [PATCH] =?UTF-8?q?fix(nmNum):=20=E8=B0=83=E6=95=B4=E6=97=B6?= =?UTF-8?q?=E5=8F=98=E8=A1=A8=E7=9A=AE=E5=9B=BE=E8=A1=A8=E8=BD=B4=E6=A0=87?= =?UTF-8?q?=E9=A2=98=E9=97=B4=E8=B7=9D=E5=B9=B6=E4=BF=9D=E6=8C=81=E7=BB=98?= =?UTF-8?q?=E5=9B=BE=E5=8C=BA=E5=B0=BA=E5=AF=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Src/nmNum/nmSubWxs/nmWxChartWidget.cpp | 19 +++++++----- .../nmSubWxs/nmWxPressFlowChartWidget.cpp | 21 +++++++------ Src/nmNum/nmSubWxs/nmWxTimeDependentSkin.cpp | 30 +++++++++++++++++-- 3 files changed, 51 insertions(+), 19 deletions(-) diff --git a/Src/nmNum/nmSubWxs/nmWxChartWidget.cpp b/Src/nmNum/nmSubWxs/nmWxChartWidget.cpp index 36b7202d..e99795bb 100644 --- a/Src/nmNum/nmSubWxs/nmWxChartWidget.cpp +++ b/Src/nmNum/nmSubWxs/nmWxChartWidget.cpp @@ -49,10 +49,11 @@ void nmWxChartWidget::paintEvent(QPaintEvent *event) QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); - int marginLeft = 55; + // 补偿窗口让出的左侧和底部空白,移动标题时保持绘图区位置和尺寸。 + int marginLeft = 55 + contentsMargins().left(); int marginRight = 10; int marginTop = 4; - int marginBottom = 45; + int marginBottom = 45 + contentsMargins().bottom(); chartRect = QRectF(marginLeft, marginTop, width() - marginLeft - marginRight, @@ -249,15 +250,19 @@ void nmWxChartWidget::drawAxes(QPainter& painter) } } - // 轴标题 + // 按文字实际边界贴近外沿,保持原有字号、绘图区和刻度位置。 painter.setFont(QFont("Arial", 10)); - painter.drawText(chartRect.center().x() - 50, chartRect.bottom() + 35, - tr("Liquid rate [STB/D]")); + const QString xTitle = tr("Liquid rate [STB/D]"); + const QRect xTitleRect = painter.fontMetrics().tightBoundingRect(xTitle); + painter.drawText(QPointF(chartRect.center().x() - xTitleRect.center().x(), + height() - 2 - xTitleRect.bottom()), xTitle); painter.save(); - painter.translate(15, chartRect.center().y()); + painter.translate(1, chartRect.center().y()); painter.rotate(-90); - painter.drawText(-15, 0, tr("Skin")); + const QString yTitle = tr("Skin"); + const QRect yTitleRect = painter.fontMetrics().tightBoundingRect(yTitle); + painter.drawText(QPointF(-yTitleRect.center().x(), -yTitleRect.top()), yTitle); painter.restore(); } diff --git a/Src/nmNum/nmSubWxs/nmWxPressFlowChartWidget.cpp b/Src/nmNum/nmSubWxs/nmWxPressFlowChartWidget.cpp index bdfae427..9c8a25cc 100644 --- a/Src/nmNum/nmSubWxs/nmWxPressFlowChartWidget.cpp +++ b/Src/nmNum/nmSubWxs/nmWxPressFlowChartWidget.cpp @@ -169,9 +169,10 @@ void nmWxPressFlowChartWidget::paintEvent(QPaintEvent *event) QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); - // 计算绘图区域 - m_plotArea = QRect(m_marginLeft, m_marginTop, - width() - m_marginLeft - m_marginRight, + // 补偿窗口让出的左侧空白,使标题左移时绘图区保持原位和原尺寸。 + const int plotLeft = m_marginLeft + contentsMargins().left(); + m_plotArea = QRect(plotLeft, m_marginTop, + width() - plotLeft - m_marginRight, height() - m_marginTop - m_marginBottom); drawBackground(painter); @@ -504,9 +505,10 @@ void nmWxPressFlowChartWidget::drawLabels(QPainter& painter) if (!m_xUnit.isEmpty()) { xLabelText += " (" + m_xUnit + ")"; } - QRect xLabelRect = painter.fontMetrics().boundingRect(xLabelText); - int xLabelX = (width() - xLabelRect.width()) / 2; - painter.drawText(xLabelX, height() - 10, xLabelText); + // 按文字实际边界贴近底部外沿,保持原有字号和绘图区。 + const QRect xLabelRect = painter.fontMetrics().tightBoundingRect(xLabelText); + painter.drawText(QPointF(m_plotArea.center().x() - xLabelRect.center().x(), + height() - 2 - xLabelRect.bottom()), xLabelText); painter.restore(); } @@ -520,10 +522,11 @@ void nmWxPressFlowChartWidget::drawLabels(QPainter& painter) yLabelText += " (" + m_yUnit + ")"; } - painter.translate(15, height() / 2); + // 去掉字体矩形内的额外留白,将文字实际左边缘放在控件边缘内一像素处。 + painter.translate(1, m_plotArea.center().y()); painter.rotate(-90); - QRect yLabelRect = painter.fontMetrics().boundingRect(yLabelText); - painter.drawText(-yLabelRect.width()/2, 0, yLabelText); + const QRect yLabelRect = painter.fontMetrics().tightBoundingRect(yLabelText); + painter.drawText(QPointF(-yLabelRect.center().x(), -yLabelRect.top()), yLabelText); painter.restore(); } } diff --git a/Src/nmNum/nmSubWxs/nmWxTimeDependentSkin.cpp b/Src/nmNum/nmSubWxs/nmWxTimeDependentSkin.cpp index 49b87d51..b2cd474d 100644 --- a/Src/nmNum/nmSubWxs/nmWxTimeDependentSkin.cpp +++ b/Src/nmNum/nmSubWxs/nmWxTimeDependentSkin.cpp @@ -309,9 +309,14 @@ void nmWxTimeDependentSkin::initUI() splitter->setHandleWidth(1); // 创建左侧区域(图表+下拉框) - QWidget* leftWidget = new QWidget(); + QWidget* leftWidget = new QWidget(splitter); QVBoxLayout* leftLayout = new QVBoxLayout(leftWidget); + // 将左侧布局留白让给图表标题,绘图区用相同宽度补偿,保持位置和大小。 + int chartLeftExtension, topMargin, rightMargin, bottomMargin; + leftLayout->getContentsMargins(&chartLeftExtension, &topMargin, &rightMargin, &bottomMargin); + leftLayout->setContentsMargins(0, topMargin, rightMargin, bottomMargin); + // 创建图表区域容器 QWidget* chartWidget = new QWidget(); m_pChartLayout = new QVBoxLayout(chartWidget); @@ -325,6 +330,8 @@ void nmWxTimeDependentSkin::initUI() // 创建压力图表 m_pPressureChart = new nmWxPressFlowChartWidget(m_pChartSplitter); + m_pPressureChart->setContentsMargins(chartLeftExtension, 0, 0, 0); + m_pPressureChart->setMinimumWidth(300 + chartLeftExtension); m_pPressureChart->setCurrentWellData(m_currentWell); m_pPressureChart->setAxisLabels(tr(""), tr("Pressure")); m_pPressureChart->setAxisUnits(tr("hr"), tr("MPa")); @@ -335,6 +342,8 @@ void nmWxTimeDependentSkin::initUI() // 创建流量图表 m_pFlowRateChart = new nmWxPressFlowChartWidget(m_pChartSplitter); + m_pFlowRateChart->setContentsMargins(chartLeftExtension, 0, 0, 0); + m_pFlowRateChart->setMinimumWidth(300 + chartLeftExtension); m_pFlowRateChart->setCurrentWellData(m_currentWell); m_pFlowRateChart->setAxisLabels(tr("Time"), tr("Flow")); m_pFlowRateChart->setAxisUnits(tr("hr"), tr("m^3/D")); @@ -363,7 +372,13 @@ void nmWxTimeDependentSkin::initUI() // 将图表和下拉框添加到左侧布局 leftLayout->addWidget(chartWidget, 1); // 图表占据大部分空间 - leftLayout->addWidget(m_pComboBox); // 下拉框固定高度 + // 下拉框仍使用原来的左边距,只有图表标题向左扩展。 + QHBoxLayout* comboLayout = new QHBoxLayout(); + comboLayout->setContentsMargins(0, 0, 0, 0); + comboLayout->addSpacing(chartLeftExtension); + comboLayout->addWidget(m_pComboBox); + comboLayout->addStretch(); + leftLayout->addLayout(comboLayout); // 创建中间区域(表格+确定取消按钮) QWidget* middleWidget = new QWidget(); @@ -923,7 +938,14 @@ void nmWxTimeDependentSkin::showInteractiveChart() // 创建交互式图表widget m_pChartWidget = new nmWxChartWidget(this); - m_pChartWidget->setMinimumSize(400, 400); + // 切换模式后沿用压力图的左侧扩展宽度,保持绘图区位置不变。 + const int chartLeftExtension = m_pPressureChart->contentsMargins().left(); + // 将图表与下拉框之间的空白交给横轴标题,绘图区补偿相同高度。 + QLayout* leftLayout = m_pComboBox->parentWidget()->layout(); + const int chartBottomExtension = qMax(0, leftLayout->spacing()); + leftLayout->setSpacing(0); + m_pChartWidget->setContentsMargins(chartLeftExtension, 0, 0, chartBottomExtension); + m_pChartWidget->setMinimumSize(400 + chartLeftExtension, 400 + chartBottomExtension); // 连接信号槽 connect(m_pChartWidget, SIGNAL(skinValuesChanged(double, double)), @@ -1089,6 +1111,8 @@ void nmWxTimeDependentSkin::restoreOriginalCharts() // 移除交互式图表 if(m_pChartWidget != nullptr) { + // 切回压力/流量图时恢复原来的布局间距。 + m_pComboBox->parentWidget()->layout()->setSpacing(m_pChartWidget->contentsMargins().bottom()); m_pChartLayout->removeWidget(m_pChartWidget); m_pChartWidget->deleteLater(); m_pChartWidget = nullptr;