#include "DataTableWidget.h" #include "DataTableItemDelegate.h" #include "ProjectManager.h" #include #include #include #include #include #include #include #include #include #include #include #include #include DataTableWidget::DataTableWidget(SchemePlanManager::SchemeProcessInfo process, QWidget *parent) : QWidget(parent), m_process(process) { m_mind1 = new CMind(this); m_mind2 = new CMind(this); initWidget(); initLayout(); connectSignalsAndSlots(); m_comboDelegate = new DataTableComboDelegate(this); } SchemePlanManager::SchemeProcessInfo DataTableWidget::process() const { return m_process; } void DataTableWidget::initWidget() { m_dataTab = new QTabWidget(this); m_dataTab->setTabPosition(QTabWidget::South); m_pageLab = new QLabel(this); m_previous = new PushButton("上一级指标", this); m_next = new PushButton("下一级指标", this); } void DataTableWidget::initLayout() { m_layout = new QVBoxLayout(this); m_layout->addWidget(m_dataTab); m_pageLayout = new QHBoxLayout(); m_layout->addLayout(m_pageLayout); m_pageLayout->setSpacing(10); m_pageLayout->addStretch(); m_pageLayout->addWidget(m_previous); m_pageLayout->addWidget(m_pageLab); m_pageLayout->addWidget(m_next); m_pageLayout->addStretch(); } void DataTableWidget::connectSignalsAndSlots() { connect(m_previous, &PushButton::clicked, this, &DataTableWidget::slotPrevious); connect(m_next, &PushButton::clicked, this, &DataTableWidget::slotNext); connect(m_dataTab, &QTabWidget::currentChanged, this, &DataTableWidget::slotTabCurrentChanged); } void DataTableWidget::setupTabWidget() { /// 创建 tableView 并添加进 tabWidget /// 这个过程中会触发 tabWidget 的 currentChanged, /// 所以使用 m_isSettingTable 标记此过程, 以采取必要措施来规避一些异常操作 m_isSettingTable = true; m_dataTab->clear(); for (CNodeData n : m_mind1->nodesInLevel(m_currentPage)) { QTableView *t = new QTableView(m_dataTab); t->setAlternatingRowColors(m_mind2->nodeList().count() > 0); t->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); t->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}"); t->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}"); t->verticalHeader()->setDefaultAlignment(Qt::AlignCenter); t->setSelectionMode(QAbstractItemView::SingleSelection); m_dataTab->addTab(t, n.name); QStandardItemModel *model = new QStandardItemModel(t); t->setModel(model); } m_isSettingTable = false; } int DataTableWidget::currentPage() const { return m_currentPage; } void DataTableWidget::setCurrentPage(int p) { if (p < 1 || p >= m_mind1->levels()) { return; } m_currentPage = p; m_previous->setEnabled(p > 1); m_next->setEnabled(p < m_mind1->levels() - 1); setupTabWidget(); m_pageLab->setText(QString("共 %1 页, 当前第 %2 页").arg(m_mind1->levels() - 1).arg(p)); updateCurrentTable(); } void DataTableWidget::updateCurrentTable() { int c = m_dataTab->currentIndex(); QTableView *table = (QTableView *)m_dataTab->widget(c); if (table == nullptr || table->model() == nullptr || m_isSettingTable) { return; } m_hNodes.clear(); m_vNodes.clear(); m_values.clear(); QStandardItemModel *model = (QStandardItemModel *)table->model(); /// 设置顶部水平方向标题 int hIndex = -1; int dimensionIndex = -1; // 量纲所在列 int typeIndex = -1; // 指标类型所在列 // 指标 CNodeData n = m_mind1->nodesInLevel(m_currentPage)[c]; QList hList = m_mind1->subNodes(n); // 以下情况需要显示指标 // 导入权重分析数据 // 导入需求分析评估的评估数据 if (m_process.type == SchemePlanManager::ImportWeightData || m_process.indexType == ProjectManager::TechIndex) { for (CNodeData node : hList) { QStandardItem *item = new QStandardItem(node.name); item->setToolTip(node.remark); model->setHorizontalHeaderItem(++hIndex, item); m_hNodes.append(node.name); } } // 导入方案优选评估或效能评估的评估数据时, 需要显示量纲 if (m_process.type == SchemePlanManager::ImportEvalData && (m_process.indexType == ProjectManager::OptimalIndex || m_process.indexType == ProjectManager::EfficiencyIndex)) { QStandardItem *item = new QStandardItem("指标量纲"); model->setHorizontalHeaderItem(++hIndex, item); dimensionIndex = hIndex; } // 导入方案优选评估的评估数据时, 需要显示指标类型 if (m_process.type == SchemePlanManager::ImportEvalData && m_process.indexType == ProjectManager::OptimalIndex) { QStandardItem *item = new QStandardItem("指标类型"); model->setHorizontalHeaderItem(++hIndex, item); typeIndex = hIndex; } /// 设置左侧垂直方向标题 QList vList; // 导入权重分析的专家数据时, 显示指标 if (m_process.type == SchemePlanManager::ImportWeightData && m_process.dSource == SchemePlanManager::FromExpert) { vList = hList; } // 导入评估数据时, 显示最后一级指标 if (m_process.type == SchemePlanManager::ImportEvalData) { if (m_process.indexType == ProjectManager::TechIndex) { vList = m_mind2->leaves(); } else { vList = m_mind1->leaves(); } } for (int i = 0; i < vList.count(); i++) { CNodeData node = vList[i]; QStandardItem *item = new QStandardItem(QString(" %1 ").arg(node.name)); item->setToolTip(node.remark); model->setVerticalHeaderItem(i, item); table->setRowHeight(i, 35); m_vNodes.append(node.name); } /// 填充量纲和指标类型 for (int i = 0; i < vList.count(); i++) { CNodeData vNode = vList[i]; QStandardItem *d = new QStandardItem(); d->setData(Qt::AlignCenter, Qt::TextAlignmentRole); // 单元格文字居中 if (dimensionIndex >= 0) { d->setText(vNode.dimension); model->setItem(i, dimensionIndex, d); } if (typeIndex >= 0) { model->setItem(i, typeIndex, d); table->setItemDelegateForColumn(typeIndex, m_comboDelegate); } table->setRowHeight(i, 35); } /// 填充单元格 if (m_process.type == SchemePlanManager::ImportWeightData) { if (m_process.dSource == SchemePlanManager::FromExpert) { for (int i = 0; i < vList.count(); i++) { CNodeData vNode = vList[i]; for (int j = 0; j < hList.count(); j++) { CNodeData hNode = hList[j]; QStandardItem *item = new QStandardItem(); item->setData(Qt::AlignCenter, Qt::TextAlignmentRole); // 单元格文字居中 item->setBackground(QBrush(QColor("white"))); for (NodeMatrixInfo info : m_data) { if (info.abscissa.toInt() == hNode.id && info.ordinate.toInt() == vNode.id) { item->setText(info.nodeValue); model->setItem(i, j, item); if (info.nodeValue.contains("/")) { qreal v = info.nodeValue.mid(2, 1).toDouble(); m_values.append(1.0 / v); } else { m_values.append(info.nodeValue.toDouble()); } break; } } } table->setRowHeight(i, 35); } } else if (m_process.dSource == SchemePlanManager::FromMeasurement) { int row = model->rowCount(); for (int j = 0; j < hList.count(); j++) { CNodeData hNode = hList[j]; QStandardItem *item = new QStandardItem(); item->setData(Qt::AlignCenter, Qt::TextAlignmentRole); // 单元格文字居中 item->setBackground(QBrush(QColor("white"))); for (NodeMatrixInfo info : m_data) { if (info.abscissa.toInt() == hNode.id) { item->setText(info.nodeValue); model->setItem(row, j, item); break; } } } } } else if (m_process.type == SchemePlanManager::ImportEvalData) { if (m_process.indexType == ProjectManager::TechIndex) { for (int i = 0; i < vList.count(); i++) { CNodeData vNode = vList[i]; for (int j = 0; j < hList.count(); j++) { CNodeData hNode = hList[j]; QStandardItem *item = new QStandardItem(); item->setData(Qt::AlignCenter, Qt::TextAlignmentRole); // 单元格文字居中 item->setBackground(QBrush(QColor("white"))); for (NodeMatrixInfo info : m_data) { if (info.abscissa.toInt() == hNode.id && info.ordinate.toInt() == vNode.id) { item->setText(info.nodeValue); model->setItem(i, j, item); break; } } } table->setRowHeight(i, 35); } } } } QStringList DataTableWidget::hNodes() const { return m_hNodes; } QStringList DataTableWidget::vNodes() const { return m_vNodes; } QVector DataTableWidget::values() const { return m_values; } CMind *DataTableWidget::mind1() const { return m_mind1; } CMind *DataTableWidget::mind2() const { return m_mind2; } void DataTableWidget::setData(QList data) { m_data = data; } void DataTableWidget::slotPrevious() { setCurrentPage(m_currentPage - 1); } void DataTableWidget::slotNext() { setCurrentPage(m_currentPage + 1); } void DataTableWidget::slotTabCurrentChanged(int c) { Q_UNUSED(c) updateCurrentTable(); }