From 34d745ff60aaf0ef2c82d40843ed9134053798b2 Mon Sep 17 00:00:00 2001 From: lh <2334563547@qq.com> Date: Mon, 7 Sep 2026 17:05:57 +0800 Subject: [PATCH] =?UTF-8?q?fix(nmNum):=20=E4=BF=AE=E6=AD=A3=E6=B5=81?= =?UTF-8?q?=E9=87=8F=E6=95=B0=E6=8D=AE=E8=AF=BB=E5=8F=96=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=8C=85=E5=90=AB=E4=BA=95=E8=A1=A8=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 按 GaugeDataEx2 实际内容判断单相与多相流量 - 将多相数据中的空相按零流量处理 - 优化包含井表格样式、序号和自适应尺寸 - 隐藏不可用的压力流量下拉项 - 更新中文翻译文件 --- Bin/Config/Lang/cn/nmNum_cn.qm | Bin 127988 -> 135798 bytes Include/nmNum/nmData/nmDataGaugeRecord.h | 8 +- .../nmNum/nmSubWxs/nmWxIncludeOtherWells.h | 2 + Src/nmNum/nmData/nmDataAnalyzeManager.cpp | 32 ++- Src/nmNum/nmSubWxs/nmWxIncludeOtherWells.cpp | 215 ++++++++++++------ 5 files changed, 172 insertions(+), 85 deletions(-) diff --git a/Bin/Config/Lang/cn/nmNum_cn.qm b/Bin/Config/Lang/cn/nmNum_cn.qm index 5f04c48cb8bd0cbfc68e6042adf023e089c87eb5..ebd8d23e4f0e8343ce9f510943bafe7436b940d0 100644 GIT binary patch delta 16229 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 diff --git a/Include/nmNum/nmData/nmDataGaugeRecord.h b/Include/nmNum/nmData/nmDataGaugeRecord.h index c9d46ad7..1ca14758 100644 --- a/Include/nmNum/nmData/nmDataGaugeRecord.h +++ b/Include/nmNum/nmData/nmDataGaugeRecord.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "nmDefines.h" @@ -26,14 +26,14 @@ struct nmPressureGaugeRecord { /** * @brief 工程井下一条流量测量记录的只读快照。 - * @note 单相记录解析 GaugeData 并按井别归入对应相;多相记录从 - * GaugeDataEx2 的 N 行数据中按 [段时长、油、气、水] 解析全部相。 + * @note GaugeDataEx2 非空时按 N 行 [段时长、油、气、水] 解析多相数据; + * 否则解析 GaugeData,并按井别归入对应的单相流量。 */ struct nmFlowGaugeRecord { QString sGaugeCode; // 对应 ZxDataGaugeF::getCode(),选择持久化键 QString sGaugeName; // 对应 ZxDataGaugeF::getGaugeName(),界面展示用 QString sGaugeTime; // 对应 ZxDataGaugeF::getGaugeTime(),界面展示用 - bool bMultiPhase; // 对应 ZxDataGaugeF::getMultiPhase() + bool bMultiPhase; // 实际是否采用 GaugeDataEx2 多相表,不依赖框架多相标志 NM_GAUGE_RECORD_STATUS eStatus; // 记录可用状态 QVector vecOilPoints; // 油相流量点,允许首项为 (0,0) 占位点 QVector vecGasPoints; // 气相流量点,允许首项为 (0,0) 占位点 diff --git a/Include/nmNum/nmSubWxs/nmWxIncludeOtherWells.h b/Include/nmNum/nmSubWxs/nmWxIncludeOtherWells.h index fde7fe25..dbce8eaf 100644 --- a/Include/nmNum/nmSubWxs/nmWxIncludeOtherWells.h +++ b/Include/nmNum/nmSubWxs/nmWxIncludeOtherWells.h @@ -82,6 +82,8 @@ private: void setupLayouts(); /** @brief 连接按钮及表格交互信号。 */ void setupConnections(); + /** @brief 根据列宽和候选井数量设置受屏幕范围约束的初始窗口尺寸。 */ + void adjustDialogSizeToTable(); /** @brief 将一条候选井数据写入指定表格行。 */ void addWellDataToTable(const WellDataRow& data, int row); diff --git a/Src/nmNum/nmData/nmDataAnalyzeManager.cpp b/Src/nmNum/nmData/nmDataAnalyzeManager.cpp index 72fa9d00..d90152d9 100644 --- a/Src/nmNum/nmData/nmDataAnalyzeManager.cpp +++ b/Src/nmNum/nmData/nmDataAnalyzeManager.cpp @@ -18,6 +18,7 @@ #include "ZxBaseUtil.h" #include #include +#include #include "zxLogInstance.h" #include "nmDataReservoir.h" @@ -192,6 +193,21 @@ static NM_GAUGE_RECORD_STATUS readBlockAndClassify( ? NM_GaugeRecord_Usable : NM_GaugeRecord_Corrupt; } +// 油水等非全相记录会把未使用相保存为空单元格,数值层按零产量接收。 +// 非空内容仍必须是有效数字,避免把真正损坏的数据静默转换为零。 +static bool readOptionalPhaseRate(const QVariant& oValue, double& dRate) +{ + if(!oValue.isValid() || oValue.isNull() || + oValue.toString().trimmed().isEmpty()) { + dRate = 0.0; + return true; + } + + bool bOk = false; + dRate = oValue.toDouble(&bOk); + return bOk; +} + // 框架的 GaugeDataEx2 保存完整多相表,格式为 N 行 x 4 列; // 每行依次为 [段时长、油、气、水]。数值模块读取时拆成三组同轴流量点, // 不根据井别或非零值删改任一相的数据。 @@ -231,14 +247,14 @@ static bool readMultiPhaseFlowTable( nPointIndex < nPointCount; ++nPointIndex) { bool bTimeOk = false; - bool bOilOk = false; - bool bGasOk = false; - bool bWaterOk = false; const QVector& vecRow = vvecRows[nPointIndex]; const double dTime = vecRow[0].toDouble(&bTimeOk); - const double dOil = vecRow[1].toDouble(&bOilOk); - const double dGas = vecRow[2].toDouble(&bGasOk); - const double dWater = vecRow[3].toDouble(&bWaterOk); + double dOil = 0.0; + double dGas = 0.0; + double dWater = 0.0; + const bool bOilOk = readOptionalPhaseRate(vecRow[1], dOil); + const bool bGasOk = readOptionalPhaseRate(vecRow[2], dGas); + const bool bWaterOk = readOptionalPhaseRate(vecRow[3], dWater); if(!bTimeOk || !bOilOk || !bGasOk || !bWaterOk) { vecOilPoints.clear(); vecGasPoints.clear(); @@ -400,7 +416,9 @@ bool nmDataAnalyzeManager::readFrameworkWellCurves( oRecord.sGaugeCode = pGaugeF->getCode(); oRecord.sGaugeName = pGaugeF->getGaugeName(); oRecord.sGaugeTime = pGaugeF->getGaugeTime(); - oRecord.bMultiPhase = pGaugeF->getMultiPhase(); + // 框架多相标志可能与实际存储不一致,正式读取只依据数据块: + // Ex2 非空表示多相表,否则按井别解析 GaugeData 单相主块。 + oRecord.bMultiPhase = !pGaugeF->getGaugeDataEx2().isEmpty(); oRecord.eStatus = oRecord.bMultiPhase ? classifyMultiPhaseFlowRecord( pGaugeF, oRecord.vecOilPoints, diff --git a/Src/nmNum/nmSubWxs/nmWxIncludeOtherWells.cpp b/Src/nmNum/nmSubWxs/nmWxIncludeOtherWells.cpp index e270fcd5..5a82e1b7 100644 --- a/Src/nmNum/nmSubWxs/nmWxIncludeOtherWells.cpp +++ b/Src/nmNum/nmSubWxs/nmWxIncludeOtherWells.cpp @@ -3,10 +3,11 @@ #include "nmDataWellBase.h" #include +#include #include +#include #include -#include -#include +#include #include namespace @@ -124,37 +125,6 @@ QString gaugeRecordLabel(const QString& sGaugeName, return sLabel; } -// 异常记录仍显示在下拉列表中,后缀用于说明其不可用于当前选择的原因。 -QString recordStatusSuffix(NM_GAUGE_RECORD_STATUS eStatus) -{ - switch(eStatus) { - case NM_GaugeRecord_Empty: - return nmWxIncludeOtherWells::tr(" (Empty)"); - case NM_GaugeRecord_Corrupt: - return nmWxIncludeOtherWells::tr(" (Corrupt)"); - case NM_GaugeRecord_InvalidIdentity: - return nmWxIncludeOtherWells::tr(" (Invalid)"); - default: - return QString(); - } -} - -// Qt 4.8 的 QComboBox 没有直接禁用单项的接口,通过其标准项模型设置标志。 -void setComboItemEnabled(QComboBox* pComboBox, int nIndex, bool bEnabled) -{ - QStandardItemModel* pModel = qobject_cast( - pComboBox == nullptr ? nullptr : pComboBox->model()); - QStandardItem* pItem = pModel == nullptr ? nullptr : pModel->item(nIndex); - if(pItem == nullptr) { - return; - } - if(bEnabled) { - pItem->setFlags(pItem->flags() | Qt::ItemIsEnabled); - } else { - pItem->setFlags(pItem->flags() & ~Qt::ItemIsEnabled); - } -} - // 流动段索引是一基索引;统计段数时必须先排除框架可能写入的公共占位行。 int flowRecordSegmentCount(const nmFlowGaugeRecord& oRecord) { @@ -252,9 +222,9 @@ void nmWxIncludeOtherWells::initUI() this->setupConnections(); this->setWindowTitle(tr("Include Other Wells")); - // 缩小时依靠横向滚动保留稳定列宽,不让中英文标题挤压下拉内容。 - this->setMinimumSize(760, 280); - this->resize(1240, 420); + // 初始尺寸跟随列宽和井数量,手动缩小时仍由滚动条保护表头及下拉内容。 + this->setMinimumSize(720, 240); + this->adjustDialogSizeToTable(); } void nmWxIncludeOtherWells::setupTable() @@ -262,14 +232,54 @@ void nmWxIncludeOtherWells::setupTable() m_pTableWidget = new QTableWidget(this); m_pTableWidget->setColumnCount(ColumnCount); m_pTableWidget->setRowCount(0); - m_pTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); - m_pTableWidget->setSelectionMode(QAbstractItemView::SingleSelection); + // 本表以复选框和下拉框作为操作入口,不使用表格行选中态。 + m_pTableWidget->setSelectionMode(QAbstractItemView::NoSelection); + m_pTableWidget->setFocusPolicy(Qt::NoFocus); m_pTableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); + m_pTableWidget->setSortingEnabled(false); + m_pTableWidget->setDragEnabled(false); + m_pTableWidget->setAcceptDrops(false); + m_pTableWidget->setDropIndicatorShown(false); m_pTableWidget->setAlternatingRowColors(true); m_pTableWidget->setWordWrap(false); m_pTableWidget->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); m_pTableWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); + // 与编辑井流量明细表使用相同的调色板、表头和网格边框。 + // 表格内下拉框采用透明无边框样式,使交替行色连续显示。 + m_pTableWidget->setStyleSheet( + "QTableWidget {" + " background-color: palette(base);" + " alternate-background-color: rgb(232, 232, 232);" + " gridline-color: palette(midlight);" + " border: 1px solid palette(mid);" + "}" + "QHeaderView {" + " background-color: palette(button);" + " color: palette(button-text);" + "}" + "QHeaderView::section {" + " background-color: palette(button);" + " color: palette(button-text);" + " border: none;" + " border-right: 1px solid palette(mid);" + " border-bottom: 1px solid palette(mid);" + "}" + "QTableCornerButton::section {" + " background-color: palette(base);" + " border: none;" + " border-right: 1px solid palette(mid);" + " border-bottom: 1px solid palette(mid);" + "}" + "QTableWidget QComboBox {" + " border: none;" + " background: transparent;" + " padding-left: 6px;" + "}" + "QTableWidget QComboBox::drop-down {" + " border: none;" + "}"); + QStringList listHeaders; listHeaders << tr("Name") << tr("Well category") << tr("Included") << tr("Oil production") << tr("Gas production") @@ -277,6 +287,7 @@ void nmWxIncludeOtherWells::setupTable() << tr("Flow segment"); m_pTableWidget->setHorizontalHeaderLabels(listHeaders); m_pTableWidget->horizontalHeader()->setVisible(true); + m_pTableWidget->horizontalHeader()->setMovable(false); m_pTableWidget->horizontalHeader()->setMinimumSectionSize(64); m_pTableWidget->horizontalHeader()->setStretchLastSection(false); m_pTableWidget->horizontalHeader()->setResizeMode( @@ -284,25 +295,21 @@ void nmWxIncludeOtherWells::setupTable() m_pTableWidget->horizontalHeader()->setResizeMode( ColumnWellCategory, QHeaderView::ResizeToContents); m_pTableWidget->horizontalHeader()->setResizeMode( - ColumnIncluded, QHeaderView::Fixed); + ColumnIncluded, QHeaderView::ResizeToContents); m_pTableWidget->horizontalHeader()->setResizeMode( - ColumnOilRate, QHeaderView::Interactive); + ColumnOilRate, QHeaderView::ResizeToContents); m_pTableWidget->horizontalHeader()->setResizeMode( - ColumnGasRate, QHeaderView::Interactive); + ColumnGasRate, QHeaderView::ResizeToContents); m_pTableWidget->horizontalHeader()->setResizeMode( - ColumnWaterRate, QHeaderView::Interactive); + ColumnWaterRate, QHeaderView::ResizeToContents); m_pTableWidget->horizontalHeader()->setResizeMode( - ColumnPressure, QHeaderView::Interactive); + ColumnPressure, QHeaderView::ResizeToContents); m_pTableWidget->horizontalHeader()->setResizeMode( - ColumnFlowSegment, QHeaderView::Fixed); - m_pTableWidget->setColumnWidth(ColumnIncluded, 76); - m_pTableWidget->setColumnWidth(ColumnOilRate, 180); - m_pTableWidget->setColumnWidth(ColumnGasRate, 180); - m_pTableWidget->setColumnWidth(ColumnWaterRate, 180); - m_pTableWidget->setColumnWidth(ColumnPressure, 190); - m_pTableWidget->setColumnWidth(ColumnFlowSegment, 96); - - m_pTableWidget->verticalHeader()->setVisible(false); + ColumnFlowSegment, QHeaderView::ResizeToContents); + + m_pTableWidget->verticalHeader()->setVisible(true); + m_pTableWidget->verticalHeader()->setMovable(false); + m_pTableWidget->verticalHeader()->setDefaultAlignment(Qt::AlignCenter); m_pTableWidget->verticalHeader()->setDefaultSectionSize(32); m_pTableWidget->verticalHeader()->setMinimumSectionSize(28); @@ -396,7 +403,73 @@ void nmWxIncludeOtherWells::setupTable() pEmptyItem->setFlags(Qt::NoItemFlags); pEmptyItem->setTextAlignment(Qt::AlignCenter); m_pTableWidget->setItem(0, 0, pEmptyItem); + // 空状态行不是候选井,不显示容易产生误解的行号“1”。 + m_pTableWidget->verticalHeader()->setVisible(false); + } else { + // Qt 默认按一基显示纵向表头;宽度随最大行号位数增长。 + const int nRowNumberWidth = m_pTableWidget->fontMetrics().width( + QString::number(m_vecWellData.size())) + 18; + m_pTableWidget->verticalHeader()->setFixedWidth( + qMax(32, nRowNumberWidth)); + } + // 单元格控件全部创建完成后再按真实表头和下拉内容计算列宽。 + m_pTableWidget->resizeColumnsToContents(); +} + +void nmWxIncludeOtherWells::adjustDialogSizeToTable() +{ + if(m_pTableWidget == nullptr || m_pMainLayout == nullptr) { + return; + } + + int nTableWidth = m_pTableWidget->frameWidth() * 2; + if(m_pTableWidget->verticalHeader()->isVisible()) { + nTableWidth += m_pTableWidget->verticalHeader()->width(); } + for(int nColumn = 0; nColumn < ColumnCount; ++nColumn) { + nTableWidth += m_pTableWidget->columnWidth(nColumn); + } + + const int nVisibleRows = qMin(qMax(1, m_pTableWidget->rowCount()), 10); + int nTableHeight = m_pTableWidget->frameWidth() * 2 + + m_pTableWidget->horizontalHeader()->sizeHint().height() + + nVisibleRows * m_pTableWidget->verticalHeader()->defaultSectionSize(); + const int nScrollBarExtent = style()->pixelMetric(QStyle::PM_ScrollBarExtent); + if(m_pTableWidget->rowCount() > nVisibleRows) { + nTableWidth += nScrollBarExtent; + } + + int nLeft = 0; + int nTop = 0; + int nRight = 0; + int nBottom = 0; + m_pMainLayout->getContentsMargins(&nLeft, &nTop, &nRight, &nBottom); + const int nLayoutWidth = nLeft + nRight; + const int nButtonHeight = qMax(m_pOkButton->sizeHint().height(), + m_pCancelButton->sizeHint().height()); + const int nLayoutHeight = nTop + nBottom + nButtonHeight + + m_pMainLayout->spacing(); + + QRect oAvailableGeometry; + QDesktopWidget* pDesktop = QApplication::desktop(); + if(pDesktop != nullptr) { + oAvailableGeometry = pDesktop->availableGeometry(this); + } + if(!oAvailableGeometry.isValid()) { + oAvailableGeometry = QRect(0, 0, 1280, 720); + } + + const int nMaximumWidth = qMax(640, oAvailableGeometry.width() * 9 / 10); + const int nMaximumHeight = qMax(260, oAvailableGeometry.height() * 4 / 5); + int nDialogWidth = qMin(nTableWidth + nLayoutWidth, nMaximumWidth); + if(nTableWidth + nLayoutWidth > nDialogWidth) { + nTableHeight += nScrollBarExtent; + } + const int nDialogHeight = qMin(nTableHeight + nLayoutHeight, + nMaximumHeight); + + resize(qMax(minimumWidth(), nDialogWidth), + qMax(minimumHeight(), nDialogHeight)); } void nmWxIncludeOtherWells::addWellDataToTable( @@ -405,6 +478,7 @@ void nmWxIncludeOtherWells::addWellDataToTable( QTableWidgetItem* pNameItem = new QTableWidgetItem(data.m_sName); pNameItem->setData(Qt::UserRole, data.m_sWellCode); pNameItem->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter); + pNameItem->setToolTip(data.m_sName); m_pTableWidget->setItem(row, ColumnName, pNameItem); QTableWidgetItem* pCategoryItem = new QTableWidgetItem( @@ -433,6 +507,7 @@ void nmWxIncludeOtherWells::addWellDataToTable( QComboBox* pRateCombo = new QComboBox(m_pTableWidget); pRateCombo->setProperty("row", row); pRateCombo->setProperty("phase", static_cast(arrPhases[nIndex])); + pRateCombo->setSizeAdjustPolicy(QComboBox::AdjustToContents); pRateCombo->setMaxVisibleItems(16); connect(pRateCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onRateSourceChanged(int))); @@ -441,6 +516,7 @@ void nmWxIncludeOtherWells::addWellDataToTable( QComboBox* pPressureCombo = new QComboBox(m_pTableWidget); pPressureCombo->setProperty("row", row); + pPressureCombo->setSizeAdjustPolicy(QComboBox::AdjustToContents); pPressureCombo->setMaxVisibleItems(16); connect(pPressureCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onPressureSourceChanged(int))); @@ -448,6 +524,7 @@ void nmWxIncludeOtherWells::addWellDataToTable( QComboBox* pSegmentCombo = new QComboBox(m_pTableWidget); pSegmentCombo->setProperty("row", row); + pSegmentCombo->setSizeAdjustPolicy(QComboBox::AdjustToContents); connect(pSegmentCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onFlowSegmentChanged(int))); m_pTableWidget->setCellWidget(row, ColumnFlowSegment, pSegmentCombo); @@ -512,18 +589,15 @@ void nmWxIncludeOtherWells::populateRateCombo( pComboBox->clear(); pComboBox->addItem(tr("None"), QString()); - // 三个分相下拉框都列出完整记录集合,但当前相无数据的记录保持可见且禁用。 + // 选择控件只展示当前相真正可用的记录;异常记录仍可在“检查数据”中查看。 for(int nIndex = 0; nIndex < data.m_vecFlowRecords.size(); ++nIndex) { const nmFlowGaugeRecord& oRecord = data.m_vecFlowRecords[nIndex]; - const bool bSelectable = isSelectableFlowPhase(oRecord, ePhase); - QString sLabel = gaugeRecordLabel( - oRecord.sGaugeName, oRecord.sGaugeCode, oRecord.sGaugeTime); - sLabel += recordStatusSuffix(oRecord.eStatus); - if(oRecord.eStatus == NM_GaugeRecord_Usable && !bSelectable) { - sLabel += tr(" (No data)"); + if(!isSelectableFlowPhase(oRecord, ePhase)) { + continue; } - pComboBox->addItem(sLabel, oRecord.sGaugeCode); - setComboItemEnabled(pComboBox, pComboBox->count() - 1, bSelectable); + pComboBox->addItem(gaugeRecordLabel( + oRecord.sGaugeName, oRecord.sGaugeCode, oRecord.sGaugeTime), + oRecord.sGaugeCode); } int nCurrentIndex = 0; @@ -549,15 +623,12 @@ void nmWxIncludeOtherWells::populatePressureCombo( pComboBox->addItem(tr("None"), QString()); for(int nIndex = 0; nIndex < data.m_vecPressureRecords.size(); ++nIndex) { const nmPressureGaugeRecord& oRecord = data.m_vecPressureRecords[nIndex]; - const bool bSelectable = isSelectablePressureRecord(oRecord); - QString sLabel = gaugeRecordLabel( - oRecord.sGaugeName, oRecord.sGaugeCode, oRecord.sGaugeTime); - sLabel += recordStatusSuffix(oRecord.eStatus); - if(oRecord.eStatus == NM_GaugeRecord_Usable && !bSelectable) { - sLabel += tr(" (No data)"); + if(!isSelectablePressureRecord(oRecord)) { + continue; } - pComboBox->addItem(sLabel, oRecord.sGaugeCode); - setComboItemEnabled(pComboBox, pComboBox->count() - 1, bSelectable); + pComboBox->addItem(gaugeRecordLabel( + oRecord.sGaugeName, oRecord.sGaugeCode, oRecord.sGaugeTime), + oRecord.sGaugeCode); } const int nCurrentIndex = pComboBox->findData( @@ -656,7 +727,6 @@ void nmWxIncludeOtherWells::onCheckBoxStateChanged(int state) return; } oData.m_bIsIncluded = state == Qt::Checked; - m_pTableWidget->selectRow(nRow); } void nmWxIncludeOtherWells::onRateSourceChanged(int nIndex) @@ -695,7 +765,6 @@ void nmWxIncludeOtherWells::onRateSourceChanged(int nIndex) // 自动使用同一记录;新记录没有的相自动回到“无”。 normalizeFlowSelection(oData); refreshRowEditors(nRow); - m_pTableWidget->selectRow(nRow); } void nmWxIncludeOtherWells::onPressureSourceChanged(int nIndex) @@ -711,7 +780,6 @@ void nmWxIncludeOtherWells::onPressureSourceChanged(int nIndex) m_vecWellData[nRow].m_sPressureGaugeCode = pComboBox->itemData(nIndex).toString(); pComboBox->setToolTip(pComboBox->currentText()); - m_pTableWidget->selectRow(nRow); } void nmWxIncludeOtherWells::onFlowSegmentChanged(int nIndex) @@ -727,7 +795,6 @@ void nmWxIncludeOtherWells::onFlowSegmentChanged(int nIndex) m_vecWellData[nRow].m_nFlowSegmentIndex = pComboBox->itemData(nIndex).toInt(); pComboBox->setToolTip(pComboBox->currentText()); - m_pTableWidget->selectRow(nRow); } QVector nmWxIncludeOtherWells::getWellData() const @@ -749,7 +816,7 @@ void nmWxIncludeOtherWells::setupLayouts() m_pButtonLayout->addWidget(m_pCancelButton); m_pMainLayout = new QVBoxLayout(this); - m_pMainLayout->addWidget(m_pTableWidget); + m_pMainLayout->addWidget(m_pTableWidget, 1); m_pMainLayout->addLayout(m_pButtonLayout); setLayout(m_pMainLayout); }