|
@@ -5,6 +5,7 @@
|
|
|
#include "ProjectManager.h"
|
|
|
#include <dbService/CNodeDataService.h>
|
|
|
#include <dbService/ClassSet.h>
|
|
|
+#include <dbService/NodeMatrixService.h>
|
|
|
|
|
|
#include <Widgets/Button.h>
|
|
|
#include <QBoxLayout>
|
|
@@ -20,6 +21,19 @@
|
|
|
|
|
|
#include <QDebug>
|
|
|
|
|
|
+static const char *kDataTabName = "tabName";
|
|
|
+
|
|
|
+DataTableItemModel::DataTableItemModel(QObject *parent) : QStandardItemModel(parent) { }
|
|
|
+
|
|
|
+QVariant DataTableItemModel::data(const QModelIndex &index, int role) const
|
|
|
+{
|
|
|
+ QVariant value = QStandardItemModel::data(index, role);
|
|
|
+ if (Qt::TextAlignmentRole == role) {
|
|
|
+ value = Qt::AlignCenter;
|
|
|
+ }
|
|
|
+ return value;
|
|
|
+}
|
|
|
+
|
|
|
DataTableWidget::DataTableWidget(SchemePlanManager::SchemeProcessInfo process, QWidget *parent)
|
|
|
: QWidget(parent), m_process(process)
|
|
|
{
|
|
@@ -68,28 +82,91 @@ void DataTableWidget::connectSignalsAndSlots()
|
|
|
connect(m_dataTab, &QTabWidget::currentChanged, this, &DataTableWidget::slotTabCurrentChanged);
|
|
|
}
|
|
|
|
|
|
+void DataTableWidget::setupModels()
|
|
|
+{
|
|
|
+ // 按照脑图层级创建各个表的 models
|
|
|
+ m_models.clear();
|
|
|
+ QList<CNodeData> hHeaders;
|
|
|
+ QList<CNodeData> vHeaders;
|
|
|
+
|
|
|
+ for (int i = 1; i < m_mind1->levels(); i++) {
|
|
|
+ QList<DataTableItemModel *> modelList;
|
|
|
+
|
|
|
+ // 方案优选和综合效能的评估数据采集页面只有一级, 不用切换页面
|
|
|
+ // 方案优选显示指标量纲和指标类型
|
|
|
+ // 综合效能显示指标类型
|
|
|
+ if (m_process.type == SchemePlanManager::ImportEvalData
|
|
|
+ && (m_process.indexType == ProjectManager::OptimalIndex
|
|
|
+ || m_process.indexType == ProjectManager::EfficiencyIndex)) {
|
|
|
+ DataTableItemModel *model = new DataTableItemModel(this);
|
|
|
+
|
|
|
+ int hIndex = -1;
|
|
|
+ QStandardItem *item = new QStandardItem("指标量纲");
|
|
|
+ model->setHorizontalHeaderItem(++hIndex, item);
|
|
|
+
|
|
|
+ if (m_process.indexType == ProjectManager::OptimalIndex) {
|
|
|
+ QStandardItem *item = new QStandardItem("指标类型");
|
|
|
+ model->setHorizontalHeaderItem(++hIndex, item);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (m_process.indexType == ProjectManager::EfficiencyIndex) {
|
|
|
+ qDebug() << __FUNCTION__ << __LINE__ << "===" << endl;
|
|
|
+ }
|
|
|
+
|
|
|
+ vHeaders = m_mind1->leaves();
|
|
|
+
|
|
|
+ updateModel(model, hHeaders, vHeaders, hIndex);
|
|
|
+ modelList.append(model);
|
|
|
+ m_models[i] = modelList;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ QList<CNodeData> nodes = m_mind1->nodesInLevel(i);
|
|
|
+ for (int j = 0; j < nodes.count(); j++) {
|
|
|
+ CNodeData node = nodes[j];
|
|
|
+ DataTableItemModel *model = new DataTableItemModel(this);
|
|
|
+
|
|
|
+ if (m_process.type == SchemePlanManager::ImportWeightData) {
|
|
|
+ hHeaders = m_mind1->subNodes(node);
|
|
|
+ if (m_process.dSource == SchemePlanManager::FromExpert) {
|
|
|
+ vHeaders = hHeaders;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (m_process.type == SchemePlanManager::ImportEvalData) {
|
|
|
+ if (m_process.indexType == ProjectManager::TechIndex) {
|
|
|
+ hHeaders = m_mind1->subNodes(node);
|
|
|
+ vHeaders = m_mind2->leaves();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ model->setProperty(kDataTabName, node.name);
|
|
|
+ updateModel(model, hHeaders, vHeaders);
|
|
|
+ modelList.append(model);
|
|
|
+ }
|
|
|
+ m_models[i] = modelList;
|
|
|
+ }
|
|
|
+
|
|
|
+ setCurrentPage(1);
|
|
|
+}
|
|
|
+
|
|
|
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);
|
|
|
+
|
|
|
+ QList<DataTableItemModel *> list = m_models[m_currentPage];
|
|
|
+ for (int j = 0; j < list.size(); j++) {
|
|
|
+ DataTableItemModel *model = list[j];
|
|
|
+ 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_dataTab->addTab(t, model->property(kDataTabName).toString());
|
|
|
}
|
|
|
- m_isSettingTable = false;
|
|
|
}
|
|
|
|
|
|
int DataTableWidget::currentPage() const
|
|
@@ -99,20 +176,20 @@ int DataTableWidget::currentPage() const
|
|
|
|
|
|
void DataTableWidget::setCurrentPage(int p)
|
|
|
{
|
|
|
- if (p < 1 || p >= m_mind1->levels()) {
|
|
|
+ if (p < 1 || p > m_models.size()) {
|
|
|
return;
|
|
|
}
|
|
|
m_currentPage = p;
|
|
|
m_previous->setEnabled(p > 1);
|
|
|
- m_next->setEnabled(p < m_mind1->levels() - 1);
|
|
|
+ m_next->setEnabled(p < m_models.size());
|
|
|
setupTabWidget();
|
|
|
|
|
|
- m_pageLab->setText(QString("共 %1 页, 当前第 %2 页").arg(m_mind1->levels() - 1).arg(p));
|
|
|
- updateCurrentTable();
|
|
|
+ m_pageLab->setText(QString("共 %1 页, 当前第 %2 页").arg(m_models.size()).arg(p));
|
|
|
}
|
|
|
|
|
|
void DataTableWidget::updateCurrentTable()
|
|
|
{
|
|
|
+ return;
|
|
|
int c = m_dataTab->currentIndex();
|
|
|
QTableView *table = (QTableView *)m_dataTab->widget(c);
|
|
|
|
|
@@ -120,10 +197,6 @@ void DataTableWidget::updateCurrentTable()
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- m_hNodes.clear();
|
|
|
- m_vNodes.clear();
|
|
|
- m_values.clear();
|
|
|
-
|
|
|
QStandardItemModel *model = (QStandardItemModel *)table->model();
|
|
|
|
|
|
/// 设置顶部水平方向标题
|
|
@@ -142,7 +215,6 @@ void DataTableWidget::updateCurrentTable()
|
|
|
QStandardItem *item = new QStandardItem(node.name);
|
|
|
item->setToolTip(node.remark);
|
|
|
model->setHorizontalHeaderItem(++hIndex, item);
|
|
|
- m_hNodes.append(node.name);
|
|
|
}
|
|
|
}
|
|
|
// 导入方案优选评估或效能评估的评估数据时, 需要显示量纲
|
|
@@ -180,7 +252,6 @@ void DataTableWidget::updateCurrentTable()
|
|
|
item->setToolTip(node.remark);
|
|
|
model->setVerticalHeaderItem(i, item);
|
|
|
table->setRowHeight(i, 35);
|
|
|
- m_vNodes.append(node.name);
|
|
|
}
|
|
|
|
|
|
/// 填充量纲和指标类型
|
|
@@ -212,18 +283,11 @@ void DataTableWidget::updateCurrentTable()
|
|
|
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);
|
|
|
+ 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;
|
|
|
}
|
|
|
}
|
|
@@ -240,9 +304,9 @@ void DataTableWidget::updateCurrentTable()
|
|
|
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);
|
|
|
+ for (NodeMatrixInfo *info : m_data) {
|
|
|
+ if (info->abscissa.toInt() == hNode.id) {
|
|
|
+ item->setText(info->nodeValue);
|
|
|
model->setItem(row, j, item);
|
|
|
break;
|
|
|
}
|
|
@@ -260,9 +324,9 @@ void DataTableWidget::updateCurrentTable()
|
|
|
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);
|
|
|
+ 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;
|
|
|
}
|
|
@@ -275,21 +339,6 @@ void DataTableWidget::updateCurrentTable()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-QStringList DataTableWidget::hNodes() const
|
|
|
-{
|
|
|
- return m_hNodes;
|
|
|
-}
|
|
|
-
|
|
|
-QStringList DataTableWidget::vNodes() const
|
|
|
-{
|
|
|
- return m_vNodes;
|
|
|
-}
|
|
|
-
|
|
|
-QVector<qreal> DataTableWidget::values() const
|
|
|
-{
|
|
|
- return m_values;
|
|
|
-}
|
|
|
-
|
|
|
CMind *DataTableWidget::mind1() const
|
|
|
{
|
|
|
return m_mind1;
|
|
@@ -300,11 +349,29 @@ CMind *DataTableWidget::mind2() const
|
|
|
return m_mind2;
|
|
|
}
|
|
|
|
|
|
-void DataTableWidget::setData(QList<NodeMatrixInfo> data)
|
|
|
+void DataTableWidget::setData(QList<NodeMatrixInfo *> data)
|
|
|
{
|
|
|
m_data = data;
|
|
|
}
|
|
|
|
|
|
+void DataTableWidget::updateModel(DataTableItemModel *model, QList<CNodeData> &hHeaders, QList<CNodeData> &vHeaders,
|
|
|
+ int hStart, int vStart)
|
|
|
+{
|
|
|
+ for (int i = 0; i < hHeaders.size(); i++) {
|
|
|
+ CNodeData node = hHeaders[i];
|
|
|
+ QStandardItem *item = new QStandardItem(node.name);
|
|
|
+ item->setToolTip(node.remark);
|
|
|
+ model->setHorizontalHeaderItem(i + hStart, item);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int i = 0; i < vHeaders.size(); i++) {
|
|
|
+ CNodeData node = vHeaders[i];
|
|
|
+ QStandardItem *item = new QStandardItem(node.name);
|
|
|
+ item->setToolTip(node.remark);
|
|
|
+ model->setVerticalHeaderItem(i + vStart, item);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void DataTableWidget::slotPrevious()
|
|
|
{
|
|
|
setCurrentPage(m_currentPage - 1);
|