Browse Source

填充指标量纲和指标类型;
物元分析法指标导入;

chengxr 1 year ago
parent
commit
aed103007f

+ 2 - 0
QFD/QFD.pro

@@ -104,6 +104,7 @@ SOURCES += \
     widgets/CustomTitleBar.cpp \
     widgets/DataCollectionWidget.cpp \
     widgets/DataProcessingWidget.cpp \
+    widgets/DataTableItemDelegate.cpp \
     widgets/DataTableWidget.cpp \
     widgets/EditNodeWidget.cpp \
     widgets/EvalReportWidget.cpp \
@@ -170,6 +171,7 @@ HEADERS += \
     widgets/CustomTitleBar.h \
     widgets/DataCollectionWidget.h \
     widgets/DataProcessingWidget.h \
+    widgets/DataTableItemDelegate.h \
     widgets/DataTableWidget.h \
     widgets/EditNodeWidget.h \
     widgets/EvalReportWidget.h \

+ 4 - 2
QFD/widgets/DataCollectionWidget.cpp

@@ -85,8 +85,10 @@ void DataCollectionWidget::setupTabWidget()
             // 综合效能评估 - 物元分析法: 效能等级配置页面, 导入评估数据页面
             if (process.algorithm == SchemePlanManager::MEA && process.indexType == ProjectManager::EfficiencyIndex) {
                 QList<MEConfigItem> items;
-                MatterElementConfigWidget *w = new MatterElementConfigWidget(items, process.efficiencyGrades);
-                m_tab->addTab(w, indexName + "-" + "物元分析法效能等级配置");
+                CMind *mind = new CMind();
+                mind->setNodeList(nodeListMap[i]);
+                MatterElementConfigWidget *mec = new MatterElementConfigWidget(mind, process.efficiencyGrades);
+                m_tab->addTab(mec, indexName + "-" + "物元分析法效能等级配置");
 
                 DataTableWidget *table = new DataTableWidget(importEffiEvalDataProcess, this);
                 table->mind1()->setNodeList(nodeListMap[i]);

+ 39 - 0
QFD/widgets/DataTableItemDelegate.cpp

@@ -0,0 +1,39 @@
+#include "DataTableItemDelegate.h"
+
+#include <QComboBox>
+#include <QLineEdit>
+
+#include <QDebug>
+
+DataTableComboDelegate::DataTableComboDelegate(QObject *parent) : QStyledItemDelegate(parent) { }
+
+QWidget *DataTableComboDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem & /* option */,
+                                              const QModelIndex & /* index */) const
+{
+    QComboBox *w = new QComboBox(parent);
+
+    w->addItem("成本型");
+    w->addItem("效益型");
+
+    return w;
+}
+
+void DataTableComboDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
+{
+    QString value      = index.model()->data(index, Qt::EditRole).toString();
+    QComboBox *spinBox = static_cast<QComboBox *>(editor);
+    spinBox->setCurrentText(value);
+}
+
+void DataTableComboDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
+{
+    QComboBox *spinBox = static_cast<QComboBox *>(editor);
+    QString value      = spinBox->currentText();
+    model->setData(index, value, Qt::EditRole);
+}
+
+void DataTableComboDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
+                                                  const QModelIndex & /*index*/) const
+{
+    editor->setGeometry(option.rect);
+}

+ 21 - 0
QFD/widgets/DataTableItemDelegate.h

@@ -0,0 +1,21 @@
+#ifndef DATATABLEITEMDELEGATE_H
+#define DATATABLEITEMDELEGATE_H
+
+#include <QStyledItemDelegate>
+
+class DataTableComboDelegate : public QStyledItemDelegate
+{
+public:
+    explicit DataTableComboDelegate(QObject *parent = nullptr);
+
+    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
+
+    void setEditorData(QWidget *editor, const QModelIndex &index) const override;
+
+    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
+
+    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
+                              const QModelIndex &index) const override;
+};
+
+#endif  // DATATABLEITEMDELEGATE_H

+ 41 - 20
QFD/widgets/DataTableWidget.cpp

@@ -1,5 +1,7 @@
 #include "DataTableWidget.h"
 
+#include "DataTableItemDelegate.h"
+
 #include "ProjectManager.h"
 #include <dbService/CNodeDataService.h>
 #include <dbService/ClassSet.h>
@@ -26,6 +28,8 @@ DataTableWidget::DataTableWidget(SchemePlanManager::SchemeProcessInfo process, Q
     initWidget();
     initLayout();
     connectSignalsAndSlots();
+
+    m_comboDelegate = new DataTableComboDelegate(this);
 }
 
 SchemePlanManager::SchemeProcessInfo DataTableWidget::process() const
@@ -118,11 +122,11 @@ void DataTableWidget::updateCurrentTable()
     QStandardItemModel *model = (QStandardItemModel *)table->model();
 
     /// 设置顶部水平方向标题
-    int hIndex = 0;
+    int hIndex = -1;
     //  导入评估数据时, 增加一列指标权重
     if (m_process.type == SchemePlanManager::ImportEvalData) {
         QStandardItem *item = new QStandardItem("指标权重");
-        model->setHorizontalHeaderItem(hIndex++, item);
+        model->setHorizontalHeaderItem(++hIndex, item);
     }
     // 指标
     CNodeData n            = m_mind1->nodesInLevel(m_currentPage)[c];
@@ -134,20 +138,25 @@ void DataTableWidget::updateCurrentTable()
         for (CNodeData node : hList) {
             QStandardItem *item = new QStandardItem(node.name);
             item->setToolTip(node.remark);
-            model->setHorizontalHeaderItem(hIndex++, item);
+            model->setHorizontalHeaderItem(++hIndex, item);
         }
     }
     // 导入方案优选评估或效能评估的评估数据时, 需要显示量纲
+    int dimensionIndex = -1;
     if (m_process.type == SchemePlanManager::ImportEvalData
         && (m_process.indexType == ProjectManager::OptimalIndex
             || m_process.indexType == ProjectManager::EfficiencyIndex)) {
         QStandardItem *item = new QStandardItem("指标量纲");
-        model->setHorizontalHeaderItem(hIndex++, item);
+        model->setHorizontalHeaderItem(++hIndex, item);
+        dimensionIndex = hIndex;
     }
     // 导入方案优选评估的评估数据时, 需要显示指标类型
+
+    int typeIndex = -1;
     if (m_process.type == SchemePlanManager::ImportEvalData && m_process.indexType == ProjectManager::OptimalIndex) {
         QStandardItem *item = new QStandardItem("指标类型");
-        model->setHorizontalHeaderItem(hIndex++, item);
+        model->setHorizontalHeaderItem(++hIndex, item);
+        typeIndex = hIndex;
     }
 
     /// 设置左侧垂直方向标题
@@ -172,25 +181,37 @@ void DataTableWidget::updateCurrentTable()
         table->setRowHeight(i, 35);
     }
 
-    return;
-
     /// 填充单元格
     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_mind2->nodeList().count() <= 0) {
-                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);
+        CNodeData node   = vList[i];
+        QStandardItem *d = new QStandardItem();
+        d->setEditable(false);
+        d->setData(Qt::AlignCenter, Qt::TextAlignmentRole);  // 单元格文字居中
+        if (dimensionIndex >= 0) {
+            d->setText(node.dimension);
+            model->setItem(i, dimensionIndex, d);
         }
 
+        if (typeIndex >= 0) {
+            model->setItem(i, typeIndex, d);
+            table->setItemDelegateForColumn(typeIndex, m_comboDelegate);
+        }
+
+        //        for (int j = 0; j < hList.count(); j++) {
+        //            QStandardItem *item = new QStandardItem();
+        //            item->setEditable(false);
+        //            if (m_mind2->nodeList().count() <= 0) {
+        //                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);
+        //        }
+
         table->setRowHeight(i, 35);
     }
 }

+ 4 - 0
QFD/widgets/DataTableWidget.h

@@ -5,6 +5,8 @@
 
 #include "SchemePlanManager.h"
 
+class DataTableComboDelegate;
+
 class CMind;
 class ProjectInfo;
 class PushButton;
@@ -69,6 +71,8 @@ private:
     QHBoxLayout *m_pageLayout = nullptr;
 
     bool m_isSettingTable = false;
+
+    DataTableComboDelegate *m_comboDelegate = nullptr;
 };
 
 #endif  // DATATABLEWIDGET_H

+ 29 - 3
QFD/widgets/MatterElementConfigWidget.cpp

@@ -2,16 +2,19 @@
 #include "MatterElementItemDelegate.h"
 #include "ui_MatterElementConfigWidget.h"
 
+#include "CMind.h"
+
 #include <QLineEdit>
 // #include <QDebug>
 
-MatterElementConfigWidget::MatterElementConfigWidget(const QList<MEConfigItem> &configItems, int domainLevel,
-                                                     QWidget *parent)
-    : QWidget(parent), ui(new Ui::MatterElementConfigWidget), m_allConfigItems(configItems), m_domainLevel(domainLevel)
+MatterElementConfigWidget::MatterElementConfigWidget(CMind *mind, int domainLevel, QWidget *parent)
+    : QWidget(parent), ui(new Ui::MatterElementConfigWidget), m_domainLevel(domainLevel), m_mind(mind)
 {
     ui->setupUi(this);
 
     initScaleDivisionTable();
+
+    initConfigItems();
     initDomainTable();
 }
 
@@ -98,6 +101,29 @@ void MatterElementConfigWidget::initDomainLevelLayout()
     connect(levelSaveBtn, &QPushButton::clicked, this, &MatterElementConfigWidget::onLevelSaveBtnClick);
 }
 
+void MatterElementConfigWidget::initConfigItems()
+{
+    // 脑图层级 < 2 时无效
+    if (m_mind->levels() < 2) {
+        return;
+    }
+    m_allConfigItems.clear();
+
+    // 使用倒数第二层节点及其子节点
+    for (CNodeData n : m_mind->nodesInLevel(m_mind->levels() - 1)) {
+        QVector<MEDomain> children;
+        for (CNodeData sub : m_mind->subNodes(n)) {
+            MEDomain d;
+            d.name = sub.name;
+            children.append(d);
+        }
+        MEConfigItem i;
+        i.parentName = n.name;
+        i.childs     = children;
+        m_allConfigItems.append(i);
+    }
+}
+
 void MatterElementConfigWidget::initDomainTable()
 {
     initDomainLevelLayout();

+ 7 - 2
QFD/widgets/MatterElementConfigWidget.h

@@ -5,6 +5,8 @@
 #include <QStandardItemModel>
 #include <QWidget>
 
+class CMind;
+
 struct MEDomain
 {
     QString name;
@@ -28,8 +30,7 @@ class MatterElementConfigWidget : public QWidget
     Q_OBJECT
 
 public:
-    explicit MatterElementConfigWidget(const QList<MEConfigItem> &configItems, int domainLevel,
-                                       QWidget *parent = nullptr);
+    explicit MatterElementConfigWidget(CMind *mind, int domainLevel, QWidget *parent = nullptr);
     ~MatterElementConfigWidget();
 
     QList<MEConfigItem> getAllConfigItems() const;
@@ -39,6 +40,8 @@ public:
 private:
     void initScaleDivisionTable();  // 标度划分表
     void initDomainLevelLayout();
+
+    void initConfigItems();
     void initDomainTable();  // 经典域、节域配置
 
 private slots:
@@ -53,6 +56,8 @@ private:
     MatterElementItemRangeDelegate *m_meRangeDelegate = nullptr;
     QList<MEConfigItem> m_allConfigItems;
     int m_domainLevel;
+
+    CMind *m_mind = nullptr;
 };
 
 #endif  // MATTERELEMENTCONFIGWIDGET_H