You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Src/nmNum/nmSubWxs/nmWxWellboreStorageCalculat...

230 lines
8.0 KiB
C++

#include "nmWxWellboreStorageCalculatorVolume.h"
#include <QTableWidget>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QHeaderView>
#include <QCoreApplication>
#include <QComboBox>
#include <cmath>
nmWxWellboreStorageCalculatorVolume::nmWxWellboreStorageCalculatorVolume(QWidget *parent) : iDlgBase(parent)
{
this->initUI(); // 初始化用户界面
this->initConnections(); // 连接信号和槽
}
nmWxWellboreStorageCalculatorVolume::~nmWxWellboreStorageCalculatorVolume()
{
}
void nmWxWellboreStorageCalculatorVolume::initUI()
{
setWindowTitle(tr("Tested chamber volume"));
setFixedSize(450, 350);
// 1. 主布局
QVBoxLayout* mainLayout = new QVBoxLayout(this);
// 2. 表格和右侧按钮布局
QHBoxLayout* tableAndButtonsLayout = new QHBoxLayout;
m_pTableWidget = new QTableWidget(this);
m_pTableWidget->setColumnCount(2);
m_pTableWidget->setHorizontalHeaderLabels(QStringList() << tr("Height") << tr("I.D."));
// 设置一个自定义表头,其中第一行是单位
m_pTableWidget->insertRow(0);
// 为第一行的垂直表头(行号)创建一个 QTableWidgetItem 并设置为空文本
m_pTableWidget->setVerticalHeaderItem(0, new QTableWidgetItem());
m_pTableWidget->verticalHeaderItem(0)->setText("");
m_pHeightUnitCombo = new QComboBox;
m_pIDUnitCombo = new QComboBox;
m_pHeightUnitCombo->addItems(QStringList() << "m" ); // << "cm" << "mm" << "in" << "0.1 in" << "ft" << "mile");
m_pIDUnitCombo->addItems(QStringList() << "m" ); // << "cm" << "mm" << "in" << "0.1 in" << "ft" << "mile");
// 设置下拉框样式表,去除边框和箭头
QString comboStyle = "QComboBox {"
"border: 0px solid transparent;"
"background-color: transparent;"
"}"
"QComboBox::drop-down {"
"border: 0px;"
"background-color: transparent;"
"}"
"QComboBox::down-arrow {"
"image: url(none);"
"}"
"QComboBox:!editable, QComboBox::drop-down:editable {"
"background-color: transparent;"
"}";
m_pHeightUnitCombo->setStyleSheet(comboStyle);
m_pIDUnitCombo->setStyleSheet(comboStyle);
// 将下拉框放置在表格的第一行,即单位行
m_pTableWidget->setCellWidget(0, 0, m_pHeightUnitCombo);
m_pTableWidget->setCellWidget(0, 1, m_pIDUnitCombo);
// 设置垂直表头,用于显示行号
QHeaderView* verticalHeader = m_pTableWidget->verticalHeader();
verticalHeader->setFixedWidth(40);
verticalHeader->setResizeMode(QHeaderView::ResizeToContents);
verticalHeader->show();
m_pTableWidget->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
m_pAddButton = new QPushButton(tr("Add"));
m_pInsertButton = new QPushButton(tr("Insert"));
m_pDeleteButton = new QPushButton(tr("Delete"));
QVBoxLayout* sideButtonsLayout = new QVBoxLayout;
sideButtonsLayout->addWidget(m_pAddButton);
sideButtonsLayout->addWidget(m_pInsertButton);
sideButtonsLayout->addWidget(m_pDeleteButton);
sideButtonsLayout->addStretch();
tableAndButtonsLayout->addWidget(m_pTableWidget);
tableAndButtonsLayout->addLayout(sideButtonsLayout);
// 3. 体积显示区域布局
QHBoxLayout* volumeLayout = new QHBoxLayout;
m_pVolumeLabel = new QLabel(tr("Volume:"));
m_pVolumeEdit = new QLineEdit;
m_pVolumeEdit->setReadOnly(true);
m_pVolumeUnitCombo = new QComboBox;
m_pVolumeUnitCombo->addItems(QStringList() << tr("m^3")); // << "cm³" << "ft³" << "gallon" << "L");
m_pVolumeUnitCombo->setStyleSheet(comboStyle); // 使用相同的样式
m_pRefreshButton = new QPushButton;
QString iconDir = QCoreApplication::applicationDirPath().section('/', 0, -2) + "/Res/Icon/";
m_pRefreshButton->setIcon(QIcon(iconDir + "NmWellboreStorageRefresh.png"));
m_pRefreshButton->setIconSize(QSize(32, 32));
m_pRefreshButton->setFixedSize(34, 34);
volumeLayout->addWidget(m_pVolumeLabel);
volumeLayout->addWidget(m_pVolumeEdit);
volumeLayout->addWidget(m_pVolumeUnitCombo);
volumeLayout->addWidget(m_pRefreshButton);
volumeLayout->addStretch();
// 4. 底部按钮布局
QHBoxLayout* bottomButtonsLayout = new QHBoxLayout;
m_pOkButton = new QPushButton(tr("OK"));
m_pCancelButton = new QPushButton(tr("Cancel"));
bottomButtonsLayout->addStretch();
bottomButtonsLayout->addWidget(m_pOkButton);
bottomButtonsLayout->addWidget(m_pCancelButton);
mainLayout->addLayout(tableAndButtonsLayout);
mainLayout->addSpacing(10);
mainLayout->addLayout(volumeLayout);
mainLayout->addSpacing(10);
mainLayout->addLayout(bottomButtonsLayout);
}
void nmWxWellboreStorageCalculatorVolume::initConnections()
{
connect(m_pAddButton, SIGNAL(clicked()), this, SLOT(onAddClicked()));
connect(m_pInsertButton, SIGNAL(clicked()), this, SLOT(onInsertClicked()));
connect(m_pDeleteButton, SIGNAL(clicked()), this, SLOT(onDeleteClicked()));
connect(m_pRefreshButton, SIGNAL(clicked()), this, SLOT(onRefreshClicked()));
connect(m_pOkButton, SIGNAL(clicked()), this, SLOT(accept()));
connect(m_pCancelButton, SIGNAL(clicked()), this, SLOT(reject()));
}
void nmWxWellboreStorageCalculatorVolume::onAddClicked()
{
int rowCount = m_pTableWidget->rowCount();
m_pTableWidget->insertRow(rowCount);
// 为新行设置行号。行号从1开始所以是当前行数减去1因为第0行是单位行
m_pTableWidget->setVerticalHeaderItem(rowCount, new QTableWidgetItem(QString::number(rowCount)));
m_pTableWidget->setItem(rowCount, 0, new QTableWidgetItem("N/A"));
m_pTableWidget->setItem(rowCount, 1, new QTableWidgetItem("N/A"));
m_pTableWidget->scrollToBottom();
}
void nmWxWellboreStorageCalculatorVolume::onInsertClicked()
{
int currentRow = m_pTableWidget->currentRow();
if (currentRow <= 0) {
return;
}
m_pTableWidget->insertRow(currentRow);
m_pTableWidget->setItem(currentRow, 0, new QTableWidgetItem("N/A"));
m_pTableWidget->setItem(currentRow, 1, new QTableWidgetItem("N/A"));
// 插入行后更新所有行号。行号从1开始。
for (int i = 1; i < m_pTableWidget->rowCount(); ++i) {
m_pTableWidget->setVerticalHeaderItem(i, new QTableWidgetItem(QString::number(i)));
}
m_pTableWidget->scrollToItem(m_pTableWidget->item(currentRow, 0));
}
void nmWxWellboreStorageCalculatorVolume::onDeleteClicked()
{
int currentRow = m_pTableWidget->currentRow();
if (currentRow > 0 && currentRow < m_pTableWidget->rowCount()) {
m_pTableWidget->removeRow(currentRow);
// 删除行后重新设置行号行号从1开始。
for (int i = 1; i < m_pTableWidget->rowCount(); ++i) {
m_pTableWidget->setVerticalHeaderItem(i, new QTableWidgetItem(QString::number(i)));
}
}
}
void nmWxWellboreStorageCalculatorVolume::onRefreshClicked()
{
calculateVolume();
}
void nmWxWellboreStorageCalculatorVolume::calculateVolume()
{
double totalVolume = 0.0;
const double PI = acos(-1.0);
// 从第二行开始遍历,跳过单位行
for (int i = 1; i < m_pTableWidget->rowCount(); ++i) {
QTableWidgetItem* heightItem = m_pTableWidget->item(i, 0);
QTableWidgetItem* idItem = m_pTableWidget->item(i, 1);
if (heightItem && idItem) {
bool okHeight, okID;
// 直接从表格中获取double值不再进行单位转换
double height = heightItem->text().toDouble(&okHeight);
double id = idItem->text().toDouble(&okID);
if (okHeight && okID) {
// 直接使用获取到的值进行计算因为默认单位就是m
double radius = id / 2.0;
double volumeSegment = PI * pow(radius, 2.0) * height;
totalVolume += volumeSegment;
}
}
}
// 将计算结果显示在QLineEdit中单位为立方米
m_pVolumeEdit->setText(QString::number(totalVolume, 'f', 6));
}
double nmWxWellboreStorageCalculatorVolume::getCalculatedVolume() const
{
bool ok;
double value = m_pVolumeEdit->text().toDouble(&ok);
if (ok && value >= 0) {
return value;
}
// 如果转换失败,返回-1
return -1;
}