Parcourir la source

提交物元分析配置界面

Signed-off-by: codeClown <zhaomengshou@126.com>
codeClown il y a 1 an
Parent
commit
9edaf47a26

+ 0 - 2
QFD/widgets/GreyClusteringConfigWidget.cpp

@@ -101,8 +101,6 @@ struct IndexItem
 
 void GreyClusteringConfigWidget::refreshTableView()
 {
-    int rows            = 9;
-    int cols            = 9;
     const int nodeDepth = 3;  // 节点深度
 
     m_grayNames   = QStringList { "较差类", "一般类", "较好类" };

+ 86 - 16
QFD/widgets/MatterElementConfigWidget.cpp

@@ -3,10 +3,11 @@
 #include "ui_MatterElementConfigWidget.h"
 
 #include <QLineEdit>
-#include <QDebug>
+// #include <QDebug>
 
-MatterElementConfigWidget::MatterElementConfigWidget(QWidget *parent)
-    : QWidget(parent), ui(new Ui::MatterElementConfigWidget)
+MatterElementConfigWidget::MatterElementConfigWidget(const QList<MEConfigItem> &configItems, int domainLevel,
+                                                     QWidget *parent)
+    : QWidget(parent), ui(new Ui::MatterElementConfigWidget), m_allConfigItems(configItems), m_domainLevel(domainLevel)
 {
     ui->setupUi(this);
 
@@ -36,19 +37,19 @@ void MatterElementConfigWidget::initScaleDivisionTable()
     m_scaleDivisionmodel->setRowCount(1);
     m_scaleDivisionmodel->setColumnCount(7);
 
-    QStringList headers = { "定义", "很差", "较差", "一般", "较高", "很高", "相邻定义" };
+    const QStringList headers = { "定义", "很差", "较差", "一般", "较高", "很高", "相邻定义" };
     m_scaleDivisionmodel->setHorizontalHeaderLabels(headers);
 
     QStandardItem *s                  = nullptr;
     MatterElementItemSpinDelegate *sd = new MatterElementItemSpinDelegate(t);
-
+    const QStringList originValues    = { "1.0", "3.0", "5.0", "7.0", "9.0", "[2.0, 4.0, 6.0, 8.0]" };
     for (int i = 0; i < headers.size(); ++i) {
         if (i == 0) {
             s = new QStandardItem("标度");
             s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
             s->setTextAlignment(Qt::AlignCenter);
         } else {
-            s = new QStandardItem();
+            s = new QStandardItem(originValues.at(i - 1));
             s->setTextAlignment(Qt::AlignCenter);
         }
 
@@ -61,6 +62,8 @@ void MatterElementConfigWidget::initScaleDivisionTable()
             t->setItemDelegateForColumn(i, new MatterElementItemInsideDelegate);
         }
     }
+
+    connect(ui->updateScaleBtn, &QPushButton::clicked, this, &MatterElementConfigWidget::onScaleValueUpdate);
 }
 
 static void clearTab(QTabWidget *tabWidget)
@@ -73,14 +76,12 @@ static void clearTab(QTabWidget *tabWidget)
     }
 }
 
-void MatterElementConfigWidget::initDomainTable()
+void MatterElementConfigWidget::initDomainLevelLayout()
 {
-    const int level = 4;
-
-    ui->levelLabel->setText(QString::number(level));
+    ui->levelLabel->setText(QString::number(m_domainLevel));
 
     QFormLayout *formLayout = new QFormLayout;
-    for (int l = 0; l < level; ++l) {
+    for (int l = 0; l < m_domainLevel; ++l) {
         auto le = new QLineEdit(QString("E%1").arg(l + 1));
         le->setMinimumHeight(30);
         le->setMaximumWidth(80);
@@ -88,22 +89,42 @@ void MatterElementConfigWidget::initDomainTable()
         formLayout->addRow(QString("%1级:").arg(l + 1), le);
     }
     auto levelSaveBtn = new QPushButton("保存");
+    levelSaveBtn->setIcon(QIcon(":/qfluentwidgets/images/icons/Save_black.svg"));
     levelSaveBtn->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
     levelSaveBtn->setMinimumHeight(30);
     levelSaveBtn->setMaximumWidth(80);
     formLayout->addRow("", levelSaveBtn);
     ui->levelWidget->setLayout(formLayout);
     connect(levelSaveBtn, &QPushButton::clicked, this, &MatterElementConfigWidget::onLevelSaveBtnClick);
+}
 
-    QStringList parentIndexs = { "一体化战场感知能力", "网络化指挥能力" };
+void MatterElementConfigWidget::initDomainTable()
+{
+    initDomainLevelLayout();
+
+    QStringList parentIndexs;
     QHash<QString, QStringList> indexs;
-    indexs.insert("一体化战场感知能力", { "信息获取", "信息传递", "信息处理" });
-    indexs.insert("网络化指挥能力", { "指挥机构效能", "指挥人员素质", "指挥系统可靠性" });
+
+    for (const auto &item : m_allConfigItems) {
+        parentIndexs << item.parentName;
+        indexs.insert(item.parentName, {});
+        for (const auto &child : item.childs) {
+            indexs[item.parentName] << child.name;
+        }
+    }
+
+    m_meRangeDelegate = new MatterElementItemRangeDelegate(this);
+
+    const QStringList rangeItems = { "很差",     "较差",     "一般",     "较高",    "很高",
+                                     "相邻较差", "相邻一般", "相邻较高", "相邻很高" };
+    QVector<double> rangeValues;
+    auto scaleValues = getScaleValues();
+    rangeValues << scaleValues.at(0) << scaleValues.at(1);
+    m_meRangeDelegate->setOriginItems(rangeItems, rangeValues);
 
     QStringList domainLevels = getDomainLevels();
 
     for (int pindex = 0; pindex < parentIndexs.size(); ++pindex) {
-        qDebug() << pindex << parentIndexs.size();
         QTableView *table = new QTableView;
         table->setAlternatingRowColors(false);
         table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
@@ -112,8 +133,11 @@ void MatterElementConfigWidget::initDomainTable()
         table->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
         table->setSelectionMode(QAbstractItemView::SingleSelection);
         table->verticalHeader()->hide();
+        table->verticalHeader()->setDefaultSectionSize(60);
         table->horizontalHeader()->hide();
         QStandardItemModel *tModel = new QStandardItemModel;
+        m_domainModels << tModel;
+
         table->setModel(tModel);
 
         int indexNumber = indexs[parentIndexs.at(pindex)].size();
@@ -138,6 +162,7 @@ void MatterElementConfigWidget::initDomainTable()
             }
 
             tModel->setItem(0, r * 4, s);
+            table->setColumnWidth(r * 4, 20);
             table->setSpan(0, r * 4, indexNumber, 1);
 
             if (r < domainLevels.size()) {
@@ -161,6 +186,8 @@ void MatterElementConfigWidget::initDomainTable()
                 s->setTextAlignment(Qt::AlignCenter);
                 tModel->setItem(k, r * 4 + 3, s);
             }
+
+            table->setItemDelegateForColumn(r * 4 + 3, m_meRangeDelegate);
         }
 
         ui->tabWidget->addTab(table, parentIndexs.at(pindex));
@@ -182,4 +209,47 @@ QStringList MatterElementConfigWidget::getDomainLevels() const
     return lvls;
 }
 
-void MatterElementConfigWidget::onLevelSaveBtnClick() { }
+QVector<QVector<double>> MatterElementConfigWidget::getScaleValues() const
+{
+    QVector<QVector<double>> newValues(2);
+
+    for (int c = 1; c < m_scaleDivisionmodel->columnCount() - 1; ++c) {
+        newValues[0] << m_scaleDivisionmodel->item(0, c)->text().toDouble();
+    }
+
+    QString value   = m_scaleDivisionmodel->item(0, m_scaleDivisionmodel->columnCount() - 1)->text();
+    QStringList tmp = value.mid(1, value.size() - 2).replace(" ", "").split(",");
+
+    for (const auto &var : tmp) {
+        newValues[1] << var.toDouble();
+    }
+
+    return newValues;
+}
+
+void MatterElementConfigWidget::onLevelSaveBtnClick()
+{
+    QStringList domainLevels = getDomainLevels();
+
+    for (auto model : m_domainModels) {
+        for (int c = 0; c < domainLevels.size(); ++c) {
+            model->item(0, c * 4 + 1)->setText(domainLevels.at(c));
+        }
+    }
+}
+
+void MatterElementConfigWidget::onScaleValueUpdate()
+{
+    ui->scaleDivisionTable->clearSelection();
+
+    QVector<double> rangeValues;
+    auto scaleValues = getScaleValues();
+    rangeValues << scaleValues.at(0) << scaleValues.at(1);
+
+    m_meRangeDelegate->updateOriginValues(rangeValues);
+}
+
+QList<MEConfigItem> MatterElementConfigWidget::getAllConfigItems() const
+{
+    return m_allConfigItems;
+}

+ 15 - 6
QFD/widgets/MatterElementConfigWidget.h

@@ -18,6 +18,7 @@ struct MEConfigItem
     QVector<MEDomain> childs;
 };
 
+class MatterElementItemRangeDelegate;
 namespace Ui {
 class MatterElementConfigWidget;
 }
@@ -27,23 +28,31 @@ class MatterElementConfigWidget : public QWidget
     Q_OBJECT
 
 public:
-    explicit MatterElementConfigWidget(QWidget *parent = nullptr);
+    explicit MatterElementConfigWidget(const QList<MEConfigItem> &configItems, int domainLevel,
+                                       QWidget *parent = nullptr);
     ~MatterElementConfigWidget();
 
+    QList<MEConfigItem> getAllConfigItems() const;
+    QStringList getDomainLevels() const;
+    QVector<QVector<double>> getScaleValues() const;
+
 private:
     void initScaleDivisionTable();  // 标度划分表
-    void initDomainTable();         // 经典域、节域配置
-    QStringList getDomainLevels() const;
+    void initDomainLevelLayout();
+    void initDomainTable();  // 经典域、节域配置
 
 private slots:
     void onLevelSaveBtnClick();
+    void onScaleValueUpdate();
 
 private:
     Ui::MatterElementConfigWidget *ui;
-
-    QStandardItemModel *m_scaleDivisionmodel;
-
+    QStandardItemModel *m_scaleDivisionmodel = nullptr;
     QList<QLineEdit *> m_levelEdits;
+    QList<QStandardItemModel *> m_domainModels;  // 配置域的表格集合
+    MatterElementItemRangeDelegate *m_meRangeDelegate = nullptr;
+    QList<MEConfigItem> m_allConfigItems;
+    int m_domainLevel;
 };
 
 #endif  // MATTERELEMENTCONFIGWIDGET_H

+ 21 - 2
QFD/widgets/MatterElementConfigWidget.ui

@@ -13,7 +13,7 @@
   <property name="windowTitle">
    <string>Form</string>
   </property>
-  <layout class="QGridLayout" name="gridLayout" rowstretch="1,5,0">
+  <layout class="QGridLayout" name="gridLayout" rowstretch="1,5">
    <item row="0" column="0">
     <widget class="QGroupBox" name="groupBox">
      <property name="title">
@@ -30,6 +30,23 @@
         </property>
        </widget>
       </item>
+      <item>
+       <widget class="QToolButton" name="updateScaleBtn">
+        <property name="toolTip">
+         <string>更新</string>
+        </property>
+        <property name="text">
+         <string>更新</string>
+        </property>
+        <property name="icon">
+         <iconset resource="../../QFluentWidgets/qfluentwidgets.qrc">
+          <normaloff>:/qfluentwidgets/images/icons/Update_black.svg</normaloff>:/qfluentwidgets/images/icons/Update_black.svg</iconset>
+        </property>
+        <property name="toolButtonStyle">
+         <enum>Qt::ToolButtonTextUnderIcon</enum>
+        </property>
+       </widget>
+      </item>
      </layout>
     </widget>
    </item>
@@ -140,6 +157,8 @@
    </item>
   </layout>
  </widget>
- <resources/>
+ <resources>
+  <include location="../../QFluentWidgets/qfluentwidgets.qrc"/>
+ </resources>
  <connections/>
 </ui>

+ 94 - 3
QFD/widgets/MatterElementItemDelegate.cpp

@@ -1,5 +1,9 @@
 #include "MatterElementItemDelegate.h"
 
+#include <QComboBox>
+#include <QMessageBox>
+// #include <QDebug>
+
 MatterElementItemSpinDelegate::MatterElementItemSpinDelegate(QObject *parent) : QStyledItemDelegate(parent) { }
 
 QWidget *MatterElementItemSpinDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem & /* option */,
@@ -26,7 +30,7 @@ void MatterElementItemSpinDelegate::setModelData(QWidget *editor, QAbstractItemM
 {
     QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox *>(editor);
     spinBox->interpretText();
-    int value = spinBox->value();
+    double value = spinBox->value();
 
     model->setData(index, value, Qt::EditRole);
 }
@@ -39,7 +43,7 @@ void MatterElementItemSpinDelegate::updateEditorGeometry(QWidget *editor, const
 
 MatterElementItemInsideDelegate::MatterElementItemInsideDelegate(QObject *parent) : QStyledItemDelegate(parent) { }
 
-QWidget *MatterElementItemInsideDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
+QWidget *MatterElementItemInsideDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem & /*option*/,
                                                        const QModelIndex & /*index*/) const
 {
     InsideWidget *editor = new InsideWidget(parent);
@@ -64,9 +68,96 @@ void MatterElementItemInsideDelegate::setModelData(QWidget *editor, QAbstractIte
 }
 
 void MatterElementItemInsideDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
-                                                           const QModelIndex &index) const
+                                                           const QModelIndex & /*index*/) const
 {
     QRect rect = option.rect;
     rect.adjust(-10, 0, 10, 50);
     editor->setGeometry(rect);
 }
+
+MatterElementItemRangeDelegate::MatterElementItemRangeDelegate(QObject *parent) : QStyledItemDelegate(parent) { }
+
+QWidget *MatterElementItemRangeDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem & /*option*/,
+                                                      const QModelIndex & /*index*/) const
+{
+    RangeWidget *editor = new RangeWidget(m_originItems, parent);
+    editor->setMinimumSize(100, 60);
+    return editor;
+}
+
+void MatterElementItemRangeDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
+{
+    QString value = index.model()->data(index, Qt::EditRole).toString();
+
+    RangeWidget *rw = static_cast<RangeWidget *>(editor);
+    if (!value.isEmpty()) {
+        QStringList tmp = value.mid(1, value.size() - 2).replace(" ", "").split(",");
+        int id1         = m_originValues.indexOf(tmp.at(0).toDouble());
+        int id2         = m_originValues.indexOf(tmp.at(1).toDouble());
+        if (id1 != -1) {
+            tmp[0] = m_originItems.at(id1);
+        }
+        if (id2 != -1) {
+            tmp[1] = m_originItems.at(id2);
+        }
+        rw->setValue(tmp.at(0), tmp.at(1));
+    } else {
+        rw->setValue(m_originItems.at(0), m_originItems.at(1));
+    }
+}
+
+void MatterElementItemRangeDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
+                                                  const QModelIndex &index) const
+{
+    RangeWidget *rw  = static_cast<RangeWidget *>(editor);
+    QStringList list = rw->result();
+
+    int id1 = m_originItems.indexOf(list.at(0));
+    int id2 = m_originItems.indexOf(list.at(1));
+
+    double t1, t2;
+    bool valid = false;
+    if (id1 == -1) {
+        t1 = list.at(0).toDouble(&valid);
+        if (!valid) {
+            QMessageBox::warning(rw, "警告", QString("左侧值%1不是数值\n配置失败").arg(list.at(0)));
+            return;
+        }
+    }
+    if (id2 == -1) {
+        t2 = list.at(1).toDouble(&valid);
+        if (!valid) {
+            QMessageBox::warning(rw, "警告", QString("右侧值%1不是数值\n配置失败").arg(list.at(1)));
+            return;
+        }
+    }
+
+    if (id1 != -1) {
+        t1 = m_originValues.at(id1);
+    }
+    if (id2 != -1) {
+        t2 = m_originValues.at(id2);
+    }
+
+    QString value = QString("(%1, %2)").arg(t1).arg(t2);
+    model->setData(index, value, Qt::EditRole);
+}
+
+void MatterElementItemRangeDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
+                                                          const QModelIndex & /*index*/) const
+{
+    QRect rect = option.rect;
+    rect.adjust(-50, 10, 10, 10);
+    editor->setGeometry(rect);
+}
+
+void MatterElementItemRangeDelegate::setOriginItems(const QStringList &originItems, const QVector<double> &originValues)
+{
+    m_originItems  = originItems;
+    m_originValues = originValues;
+}
+
+void MatterElementItemRangeDelegate::updateOriginValues(const QVector<double> &values)
+{
+    m_originValues = values;
+}

+ 74 - 3
QFD/widgets/MatterElementItemDelegate.h

@@ -4,6 +4,7 @@
 #include <QStyledItemDelegate>
 #include <QFormLayout>
 #include <QDoubleSpinBox>
+#include <QComboBox>
 
 class InsideWidget : public QFrame
 {
@@ -11,13 +12,19 @@ class InsideWidget : public QFrame
 public:
     InsideWidget(QWidget *parent = nullptr) : QFrame(parent)
     {
+        QHBoxLayout *vcenter = new QHBoxLayout;
+        vcenter->setMargin(0);
+        vcenter->setSpacing(0);
         QFormLayout *layout = new QFormLayout;
         setStyleSheet("InsideWidget{background-color:gray} QLabel{color:white}");
-        layout->setMargin(10);
+        layout->setLabelAlignment(Qt::AlignCenter);
+        vcenter->addSpacerItem(new QSpacerItem(10, 10, QSizePolicy::Expanding));
+        vcenter->addLayout(layout);
+        vcenter->addSpacerItem(new QSpacerItem(10, 10, QSizePolicy::Expanding));
+        layout->setMargin(2);
         layout->setSpacing(2);
         for (int i = 0; i < 4; ++i) {
             auto s = new QDoubleSpinBox;
-            //            s->setMaximumWidth(40);
             s->setFrame(false);
             s->setMinimum(-10000);
             s->setMaximum(10000);
@@ -27,7 +34,7 @@ public:
         layout->addRow("[较差,一般]中间值:", m_spins.at(1));
         layout->addRow("[一般,较高]中间值:", m_spins.at(2));
         layout->addRow("[较高,很高]中间值:", m_spins.at(3));
-        setLayout(layout);
+        setLayout(vcenter);
     }
     virtual ~InsideWidget() { }
 
@@ -95,4 +102,68 @@ public:
                               const QModelIndex &index) const override;
 };
 
+class RangeWidget : public QFrame
+{
+    Q_OBJECT
+public:
+    RangeWidget(const QStringList &items, QWidget *parent = nullptr) : QFrame(parent)
+    {
+        QFormLayout *layout = new QFormLayout;
+        setStyleSheet("RangeWidget{background-color:gray}");
+        layout->setMargin(10);
+        layout->setSpacing(2);
+        m_leftCombInput = new QComboBox();
+        m_leftCombInput->setMaxVisibleItems(15);
+        m_leftCombInput->setEditable(true);
+        m_leftCombInput->addItems(items);
+        m_leftCombInput->setCurrentIndex(0);
+        m_rightCombInput = new QComboBox();
+        m_rightCombInput->setMaxVisibleItems(15);
+        m_rightCombInput->setEditable(true);
+        m_rightCombInput->addItems(items);
+        m_rightCombInput->setCurrentIndex(0);
+        layout->addRow("左:", m_leftCombInput);
+        layout->addRow("右:", m_rightCombInput);
+
+        setLayout(layout);
+    }
+    virtual ~RangeWidget() { }
+
+    QStringList result() { return { m_leftCombInput->currentText(), m_rightCombInput->currentText() }; }
+
+    void setValue(const QString &lValue, const QString &rValue)
+    {
+        m_leftCombInput->setCurrentText(lValue);
+        m_rightCombInput->setCurrentText(rValue);
+    }
+
+private:
+    QComboBox *m_leftCombInput;
+    QComboBox *m_rightCombInput;
+};
+
+class MatterElementItemRangeDelegate : public QStyledItemDelegate
+{
+    Q_OBJECT
+
+public:
+    MatterElementItemRangeDelegate(QObject *parent = 0);
+
+    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;
+
+    void setOriginItems(const QStringList &originItems, const QVector<double> &originValues);
+
+    void updateOriginValues(const QVector<double> &values);
+
+private:
+    QStringList m_originItems;
+    QVector<double> m_originValues;
+};
+
 #endif  // MATTERELEMENTITEMDELEGATE_H

+ 6 - 2
QFD/widgets/MixWithComboxInput.cpp

@@ -1,4 +1,4 @@
-#include "MixWithComboxInput.h"
+#include "MixWithComboxInput.h"
 
 #include <QComboBox>
 #include <QLabel>
@@ -49,7 +49,6 @@ MixWithComboxInput::MixWithComboxInput(QWidget *parent) : QStackedWidget(parent)
     d->isFlat = true;
 
     connect(d->combo, SIGNAL(activated(QString)), this, SIGNAL(inputLevelChanged(QString)));
-    connect(d->combo, SIGNAL(activated(QString)), this, SLOT(setCurrentInputLevel(QString)));
 }
 
 MixWithComboxInput::~MixWithComboxInput()
@@ -136,6 +135,11 @@ void MixWithComboxInput::setInputLevels(const QStringList &levels)
     d->combo->addItems(levels);
 }
 
+QString MixWithComboxInput::currentInputLevel() const
+{
+    return d->label->text();
+}
+
 void MixWithComboxInput::setCurrentInputLevel(const QString &level)
 {
     d->combo->setCurrentIndex(d->combo->findText(level));

+ 2 - 1
QFD/widgets/MixWithComboxInput.h

@@ -1,4 +1,4 @@
-#ifndef MIXWITHCOMBOXINPUT_H
+#ifndef MIXWITHCOMBOXINPUT_H
 #define MIXWITHCOMBOXINPUT_H
 
 #include <QStackedWidget>
@@ -14,6 +14,7 @@ public:
     void setFlat(bool flat);
 
     void setInputLevels(const QStringList &levels);
+    QString currentInputLevel() const;
 
     bool eventFilter(QObject *watched, QEvent *event) override;