#include "DataTableWidget.h" #include "ProjectManager.h" #include #include #include #include #include #include #include #include #include #include #include #include #include DataTableWidget::DataTableWidget(ProjectInfo *proj, int indexType, QWidget *parent) : QWidget(parent), m_proj(proj), m_indexType(indexType) { m_mind1 = new CMind(this); m_mind2 = new CMind(this); initWidget(); initLayout(); connectSignalsAndSlots(); setupMind(); setCurrentPage(1); } 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::setupMind() { QList list; bool ret = CNodeDataService().QueryAll(list, m_proj->id, m_indexType); if (ret) { m_mind1->setNodeList(list); } if (m_indexType == ProjectManager::TechIndex) { QList list; bool ret = CNodeDataService().QueryAll(list, m_proj->id, ProjectManager::AbilityIndex); if (ret) { m_mind2->setNodeList(list); } } } 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_indexType == ProjectManager::TechIndex); 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; 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; } // 设置顶部水平方向标题 QStandardItemModel *model = (QStandardItemModel *)table->model(); CNodeData n = m_mind1->nodesInLevel(m_currentPage)[c]; QList hList = m_mind1->subNodes(n); for (int i = 0; i < hList.count(); i++) { CNodeData node = hList[i]; QStandardItem *item = new QStandardItem(node.name); item->setToolTip(node.remark); model->setHorizontalHeaderItem(i, item); } // 设置左侧垂直方向标题 QList vList = hList; if (m_indexType == ProjectManager::TechIndex) { vList = m_mind2->nodesInFinalLevel(); } 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); } // 填充单元格 for (int i = 0; i < vList.count(); i++) { for (int j = 0; j < hList.count(); j++) { QStandardItem *item = new QStandardItem(); item->setEditable(false); if (m_indexType != ProjectManager::TechIndex) { if (i == j) { item->setText("1"); // 对角线 } if (i >= j) { item->setBackground(QBrush(QColor("lightgray"))); // 左下方 } } item->setData(Qt::AlignCenter, Qt::TextAlignmentRole); // 单元格文字居中 model->setItem(i, j, item); } } } void DataTableWidget::slotPrevious() { setCurrentPage(m_currentPage - 1); } void DataTableWidget::slotNext() { setCurrentPage(m_currentPage + 1); } void DataTableWidget::slotTabCurrentChanged(int c) { Q_UNUSED(c) updateCurrentTable(); }