Browse Source

渲染数据收集表格

chengxr 1 year ago
parent
commit
7e7a270880
2 changed files with 97 additions and 10 deletions
  1. 90 10
      QFD/widgets/DataTableWidget.cpp
  2. 7 0
      QFD/widgets/DataTableWidget.h

+ 90 - 10
QFD/widgets/DataTableWidget.cpp

@@ -10,6 +10,11 @@
 #include <QTabWidget>
 #include <QLabel>
 #include <QTableView>
+#include <QTableWidget>
+#include <QAbstractItemModel>
+#include <QStandardItemModel>
+#include <QStandardItem>
+#include <QHeaderView>
 
 #include <QDebug>
 
@@ -22,6 +27,7 @@ DataTableWidget::DataTableWidget(ProjectInfo *proj, int indexType, QWidget *pare
     initLayout();
     connectSignalsAndSlots();
     setupMind();
+    setCurrentPage(1);
 }
 
 void DataTableWidget::initWidget()
@@ -52,27 +58,48 @@ 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()
 {
-    ProjectManager::IndexType t = (ProjectManager::IndexType)m_indexType;
-
     QList<CNodeData> list;
-    bool ret = CNodeDataService().QueryAll(list, m_proj->id, t);
+    bool ret = CNodeDataService().QueryAll(list, m_proj->id, m_indexType);
     if (ret) {
         m_mind1->setNodeList(list);
     }
 
-    if (t == ProjectManager::TechIndex) {
+    if (m_indexType == ProjectManager::TechIndex) {
         QList<CNodeData> list;
         bool ret = CNodeDataService().QueryAll(list, m_proj->id, ProjectManager::AbilityIndex);
         if (ret) {
             m_mind2->setNodeList(list);
         }
     }
+}
 
-    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);
+        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
@@ -86,13 +113,60 @@ void DataTableWidget::setCurrentPage(int p)
         return;
     }
     m_currentPage = p;
-    m_dataTab->clear();
-    for (CNodeData n : m_mind1->nodesInLevel(p)) {
-        QTableView *t = new QTableView(m_dataTab);
-        m_dataTab->addTab(t, n.name);
-    }
+
+    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<CNodeData> hList    = m_mind1->subNodes(n);
+    for (int i = 0; i < hList.count(); i++) {
+        CNodeData node = hList[i];
+        model->setHorizontalHeaderItem(i, new QStandardItem(node.name));
+    }
+
+    // 设置左侧垂直方向标题
+    QList<CNodeData> 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));
+        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()
@@ -104,3 +178,9 @@ void DataTableWidget::slotNext()
 {
     setCurrentPage(m_currentPage + 1);
 }
+
+void DataTableWidget::slotTabCurrentChanged(int c)
+{
+    Q_UNUSED(c)
+    updateCurrentTable();
+}

+ 7 - 0
QFD/widgets/DataTableWidget.h

@@ -27,15 +27,20 @@ public:
 
     void setupMind();
 
+    void setupTabWidget();
+
     int currentPage() const;
 
     void setCurrentPage(int p);
 
+    void updateCurrentTable();
+
 signals:
 
 public slots:
     void slotPrevious();
     void slotNext();
+    void slotTabCurrentChanged(int c);
 
 private:
     ProjectInfo *m_proj = nullptr;
@@ -54,6 +59,8 @@ private:
 
     QVBoxLayout *m_layout     = nullptr;
     QHBoxLayout *m_pageLayout = nullptr;
+
+    bool m_isSettingTable = false;
 };
 
 #endif  // DATATABLEWIDGET_H