fix(nmNum): 调整时变表皮图表轴标题间距并保持绘图区尺寸

feature/Fix-TimeDependentSkin-20261029
lvjunjie 2 weeks ago
parent 259508166b
commit ea1af96909

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

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

@ -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;

Loading…
Cancel
Save