Browse Source

数据采集页面布局

chengxr 1 year ago
parent
commit
6b310904dc

+ 53 - 0
QFD/CCanvas/CMind.cpp

@@ -169,3 +169,56 @@ void CMind::clear()
 {
     m_nodeList.clear();
 }
+
+int CMind::levelOfNode(CNodeData n) const
+{
+    int l = 1;
+    if (n.hasParent()) {
+        CNodeData p = node(n.pNumber);
+        l           = levelOfNode(p) + 1;
+    }
+    return l;
+}
+
+int CMind::levels() const
+{
+    int l = 0;
+    for (CNodeData n : m_nodeList) {
+        l = std::max(l, levelOfNode(n));
+    }
+    return l;
+}
+
+QList<CNodeData> CMind::nodesInLevel(int i) const
+{
+    QList<CNodeData> l;
+    for (CNodeData n : m_nodeList) {
+        if (levelOfNode(n) == i) {
+            l.append(n);
+        }
+    }
+    return l;
+}
+
+QList<CNodeData> CMind::nodesInFinalLevel() const
+{
+    QList<CNodeData> l;
+    int lev = levels();
+    for (CNodeData n : m_nodeList) {
+        if (levelOfNode(n) == lev) {
+            l.append(n);
+        }
+    }
+    return l;
+}
+
+QList<CNodeData> CMind::subNodes(CNodeData n) const
+{
+    QList<CNodeData> l;
+    for (CNodeData t : m_nodeList) {
+        if (t.pNumber == n.number) {
+            l.append(t);
+        }
+    }
+    return l;
+}

+ 15 - 0
QFD/CCanvas/CMind.h

@@ -37,6 +37,21 @@ public:
 
     void clear();
 
+    // 节点所在层级
+    int levelOfNode(CNodeData n) const;
+
+    // 节点图层级数
+    int levels() const;
+
+    // 某一层节点列表, 第1层为根节点
+    QList<CNodeData> nodesInLevel(int i) const;
+
+    // 最后一层节点
+    QList<CNodeData> nodesInFinalLevel() const;
+
+    // 子节点列表
+    QList<CNodeData> subNodes(CNodeData n) const;
+
 signals:
     void sigRemoveNode(int id);
 

+ 2 - 0
QFD/QFD.pro

@@ -92,6 +92,7 @@ SOURCES += \
     widgets/CustomTitleBar.cpp \
     widgets/DataCollectionWidget.cpp \
     widgets/DataProcessingWidget.cpp \
+    widgets/DataTableWidget.cpp \
     widgets/EvalSchemeWidget.cpp \
     widgets/EvalSchemeWidget2.cpp \
     widgets/EvalWidget.cpp \
@@ -138,6 +139,7 @@ HEADERS += \
     widgets/CustomTitleBar.h \
     widgets/DataCollectionWidget.h \
     widgets/DataProcessingWidget.h \
+    widgets/DataTableWidget.h \
     widgets/EvalSchemeWidget.h \
     widgets/EvalSchemeWidget2.h \
     widgets/EvalWidget.h \

+ 5 - 4
QFD/common/ProjectManager.h

@@ -15,16 +15,17 @@ public:
     {
         AbilityIndex    = 0b1,       // 能力重要度评估指标体系
         TechIndex       = 0b1 << 1,  // 技术措施重要度评估对象
-        OptimalIndex    = 0b1 << 2,  // 方案评估指标体系
-        EfficiencyIndex = 0b1 << 3,  // 综合效能评估指标体系?
+        OptimalIndex    = 0b1 << 2,  // 方案优选评估指标体系
+        EfficiencyIndex = 0b1 << 3,  // 综合效能评估指标体系
     };
 
     Q_ENUM(IndexType)
 
     static QString nameOfIndexType(IndexType t);
 
-    /// 评估方案类型
-    /// @attention 枚举值与本地数据库关联,可以新增,但如无必要禁止修改,除非你知道自己在干什么
+    /// 评估类型
+    /// 评估类型是根据指标类型体系定义的
+    /// 一个评估类型包含一个或多个指标体系类型
     enum EvalType
     {
         None,

+ 3 - 1
QFD/widgets/DataCollectionWidget.cpp

@@ -1,5 +1,7 @@
 #include "DataCollectionWidget.h"
 
+#include "DataTableWidget.h"
+
 #include <QTabWidget>
 
 DataCollectionWidget::DataCollectionWidget(ProjectInfo *proj, QWidget *parent) : EvalWidget(proj, parent)
@@ -17,7 +19,7 @@ void DataCollectionWidget::setupTabWidget()
 {
     m_tab->clear();
     for (int i : indexList()) {
-        QWidget *m                  = new QWidget(this);
+        DataTableWidget *m          = new DataTableWidget(proj(), i, this);
         ProjectManager::IndexType t = (ProjectManager::IndexType)i;
         QString s                   = ProjectManager::nameOfIndexType(t);
         m_tab->addTab(m, s);

+ 5 - 0
QFD/widgets/DataCollectionWidget.h

@@ -3,6 +3,11 @@
 
 #include "EvalWidget.h"
 
+class PushButton;
+
+class QTabWidget;
+class QHBoxLayout;
+
 /**
  * @brief The DataCollectionWidget class
  * 数据采集

+ 106 - 0
QFD/widgets/DataTableWidget.cpp

@@ -0,0 +1,106 @@
+#include "DataTableWidget.h"
+
+#include "ProjectManager.h"
+#include <dbService/CNodeDataService.h>
+#include <dbService/ClassSet.h>
+
+#include <Widgets/Button.h>
+#include <QBoxLayout>
+
+#include <QTabWidget>
+#include <QLabel>
+#include <QTableView>
+
+#include <QDebug>
+
+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();
+}
+
+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);
+}
+
+void DataTableWidget::setupMind()
+{
+    ProjectManager::IndexType t = (ProjectManager::IndexType)m_indexType;
+
+    QList<CNodeData> list;
+    bool ret = CNodeDataService().QueryAll(list, m_proj->id, t);
+    if (ret) {
+        m_mind1->setNodeList(list);
+    }
+
+    if (t == ProjectManager::TechIndex) {
+        QList<CNodeData> list;
+        bool ret = CNodeDataService().QueryAll(list, m_proj->id, ProjectManager::AbilityIndex);
+        if (ret) {
+            m_mind2->setNodeList(list);
+        }
+    }
+
+    setCurrentPage(1);
+}
+
+int DataTableWidget::currentPage() const
+{
+    return m_currentPage;
+}
+
+void DataTableWidget::setCurrentPage(int p)
+{
+    if (p < 1 || p >= m_mind1->levels()) {
+        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);
+    }
+
+    m_pageLab->setText(QString("共 %1 页, 当前第 %2 页").arg(m_mind1->levels() - 1).arg(p));
+}
+
+void DataTableWidget::slotPrevious()
+{
+    setCurrentPage(m_currentPage - 1);
+}
+
+void DataTableWidget::slotNext()
+{
+    setCurrentPage(m_currentPage + 1);
+}

+ 59 - 0
QFD/widgets/DataTableWidget.h

@@ -0,0 +1,59 @@
+#ifndef DATATABLEWIDGET_H
+#define DATATABLEWIDGET_H
+
+#include <QWidget>
+
+class CMind;
+class ProjectInfo;
+class PushButton;
+
+class QLabel;
+class QTabWidget;
+
+class QVBoxLayout;
+class QHBoxLayout;
+
+class DataTableWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    explicit DataTableWidget(ProjectInfo *proj, int indexType, QWidget *parent = nullptr);
+
+    void initWidget();
+
+    void initLayout();
+
+    void connectSignalsAndSlots();
+
+    void setupMind();
+
+    int currentPage() const;
+
+    void setCurrentPage(int p);
+
+signals:
+
+public slots:
+    void slotPrevious();
+    void slotNext();
+
+private:
+    ProjectInfo *m_proj = nullptr;
+    int m_indexType;
+
+    int m_currentPage = 0;
+
+    CMind *m_mind1 = nullptr;
+    CMind *m_mind2 = nullptr;
+
+    QTabWidget *m_dataTab = nullptr;
+
+    QLabel *m_pageLab      = nullptr;  // 共4页, 当前第2页
+    PushButton *m_previous = nullptr;  // 上一级指标
+    PushButton *m_next     = nullptr;  // 下一级指标
+
+    QVBoxLayout *m_layout     = nullptr;
+    QHBoxLayout *m_pageLayout = nullptr;
+};
+
+#endif  // DATATABLEWIDGET_H

+ 2 - 0
QFD/widgets/EvalSchemeWidget2.cpp

@@ -3,6 +3,7 @@
 #include <CSchemeView.h>
 
 #include <QTabWidget>
+#include <QLayout>
 
 EvalSchemeWidget2::EvalSchemeWidget2(ProjectInfo *proj, QWidget *parent) : EvalWidget(proj, parent)
 {
@@ -18,6 +19,7 @@ void EvalSchemeWidget2::setType(int type)
 void EvalSchemeWidget2::setupTabWidget()
 {
     m_tab->clear();
+
     for (int i : indexList()) {
         CSchemeView *m              = new CSchemeView(this);
         ProjectManager::IndexType t = (ProjectManager::IndexType)i;

+ 1 - 0
QFD/widgets/EvalWidget.cpp

@@ -60,6 +60,7 @@ void EvalWidget::initWidgets()
     m_seperator->setPalette(pal);
 
     m_tab = new QTabWidget(this);
+    m_tab->setTabShape(QTabWidget::Rounded);
 }
 
 void EvalWidget::initLayout()

+ 1 - 0
QFD/widgets/EvalWidget.h

@@ -23,6 +23,7 @@ public:
     int type() const;
     virtual void setType(int type);
 
+    // 包含的指标体系
     QList<ProjectManager::IndexType> indexList() const;
 
     void setTitle(const QString title);