Sfoglia il codice sorgente

物元配置

Signed-off-by: codeClown <zhaomengshou@126.com>
codeClown 1 anno fa
parent
commit
59e0eaa42d

+ 6 - 1
QFD/QFD.pro

@@ -116,6 +116,8 @@ SOURCES += \
     widgets/GreyClusteringSampleTable.cpp \
     widgets/IndexSystemWidget.cpp \
     widgets/LoginWidget.cpp \
+    widgets/MatterElementConfigWidget.cpp \
+    widgets/MatterElementItemDelegate.cpp \
     widgets/MultiLevelHeaderView.cpp \
     widgets/ProjectListWidget.cpp \
     widgets/ProjectStateWidget.cpp \
@@ -178,6 +180,8 @@ HEADERS += \
     widgets/GreyClusteringSampleTable.h \
     widgets/IndexSystemWidget.h \
     widgets/LoginWidget.h \
+    widgets/MatterElementConfigWidget.h \
+    widgets/MatterElementItemDelegate.h \
     widgets/MultiLevelHeaderView.h \
     widgets/ProjectListWidget.h \
     widgets/ProjectStateWidget.h \
@@ -212,7 +216,8 @@ RESOURCES += \
     resource.qrc
 
 FORMS += \
-    widgets/GreyClusteringConfigWidget.ui
+    widgets/GreyClusteringConfigWidget.ui \
+    widgets/MatterElementConfigWidget.ui
 
 VERSION = "2.1.2.1"
 

+ 7 - 6
QFD/main.cpp

@@ -1,17 +1,18 @@
 #include "view/LoginView.h"
 #include "view/MainWindow.h"
+#include "helper/GenerateMiniDump.h"
 
-#include <shemeFlow/ShemeFlowPanel.h>
+#include "MatterElementConfigWidget.h"
 
 #include <QApplication>
-
 #include <QTranslator>
 #include <QSqlDatabase>
-
 #include <QDebug>
 
 int main(int argc, char *argv[])
 {
+    DUMP_FILE_HOOK_HANLE;
+
     QApplication a(argc, argv);
     a.setApplicationVersion("2.0");
     a.setApplicationName("QFD2");
@@ -26,12 +27,12 @@ int main(int argc, char *argv[])
     translator->load(QLocale::system(), ":/resource/i18n/qfluentwidgets_zh.qm");
     QCoreApplication::installTranslator(translator);
 
+    //    MatterElementConfigWidget mecw;
+    //    mecw.show();
+
     MainWindow m;
     m.show();
     qDebug() << QSqlDatabase::drivers();
 
-    //    ShemeFlowPanel s;
-    //    s.show();
-
     return a.exec();
 }

+ 1 - 1
QFD/widgets/GreyClusteringConfigWidget.ui

@@ -17,7 +17,7 @@
    <item row="0" column="1">
     <widget class="QStackedWidget" name="stackedWidget">
      <property name="currentIndex">
-      <number>1</number>
+      <number>0</number>
      </property>
      <widget class="QWidget" name="categoryPage">
       <layout class="QGridLayout" name="gridLayout">

+ 1 - 1
QFD/widgets/GreyClusteringItemDelegate.cpp

@@ -72,7 +72,7 @@ void GreyClusteringItemSpinDelegate::setModelData(QWidget *editor, QAbstractItem
 }
 
 void GreyClusteringItemSpinDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
-                                                          const QModelIndex &index) const
+                                                          const QModelIndex & /*index*/) const
 {
     editor->setGeometry(option.rect);
 }

+ 185 - 0
QFD/widgets/MatterElementConfigWidget.cpp

@@ -0,0 +1,185 @@
+#include "MatterElementConfigWidget.h"
+#include "MatterElementItemDelegate.h"
+#include "ui_MatterElementConfigWidget.h"
+
+#include <QLineEdit>
+#include <QDebug>
+
+MatterElementConfigWidget::MatterElementConfigWidget(QWidget *parent)
+    : QWidget(parent), ui(new Ui::MatterElementConfigWidget)
+{
+    ui->setupUi(this);
+
+    initScaleDivisionTable();
+    initDomainTable();
+}
+
+MatterElementConfigWidget::~MatterElementConfigWidget()
+{
+    delete ui;
+}
+
+void MatterElementConfigWidget::initScaleDivisionTable()
+{
+    QTableView *t = ui->scaleDivisionTable;
+    t->setAlternatingRowColors(false);
+    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);
+    t->verticalHeader()->hide();
+
+    m_scaleDivisionmodel = new QStandardItemModel;
+    t->setModel(m_scaleDivisionmodel);
+
+    m_scaleDivisionmodel->setRowCount(1);
+    m_scaleDivisionmodel->setColumnCount(7);
+
+    QStringList headers = { "定义", "很差", "较差", "一般", "较高", "很高", "相邻定义" };
+    m_scaleDivisionmodel->setHorizontalHeaderLabels(headers);
+
+    QStandardItem *s                  = nullptr;
+    MatterElementItemSpinDelegate *sd = new MatterElementItemSpinDelegate(t);
+
+    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->setTextAlignment(Qt::AlignCenter);
+        }
+
+        m_scaleDivisionmodel->setItem(0, i, s);
+
+        if (i > 0 && i < headers.size() - 1) {
+            t->setItemDelegateForColumn(i, sd);
+        }
+        if (i == headers.size() - 1) {
+            t->setItemDelegateForColumn(i, new MatterElementItemInsideDelegate);
+        }
+    }
+}
+
+static void clearTab(QTabWidget *tabWidget)
+{
+    while (tabWidget->count() > 0) {
+        auto widget = tabWidget->widget(0);  // 获取当前页对应的widget
+        tabWidget->removeTab(0);             // 从QTabWidget中删除当前页
+        widget->setParent(nullptr);          // 从父控件中删除widget对象
+        widget->deleteLater();               // 删除widget对象
+    }
+}
+
+void MatterElementConfigWidget::initDomainTable()
+{
+    const int level = 4;
+
+    ui->levelLabel->setText(QString::number(level));
+
+    QFormLayout *formLayout = new QFormLayout;
+    for (int l = 0; l < level; ++l) {
+        auto le = new QLineEdit(QString("E%1").arg(l + 1));
+        le->setMinimumHeight(30);
+        le->setMaximumWidth(80);
+        m_levelEdits << le;
+        formLayout->addRow(QString("%1级:").arg(l + 1), le);
+    }
+    auto levelSaveBtn = new QPushButton("保存");
+    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 = { "一体化战场感知能力", "网络化指挥能力" };
+    QHash<QString, QStringList> indexs;
+    indexs.insert("一体化战场感知能力", { "信息获取", "信息传递", "信息处理" });
+    indexs.insert("网络化指挥能力", { "指挥机构效能", "指挥人员素质", "指挥系统可靠性" });
+
+    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);
+        table->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
+        table->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
+        table->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
+        table->setSelectionMode(QAbstractItemView::SingleSelection);
+        table->verticalHeader()->hide();
+        table->horizontalHeader()->hide();
+        QStandardItemModel *tModel = new QStandardItemModel;
+        table->setModel(tModel);
+
+        int indexNumber = indexs[parentIndexs.at(pindex)].size();
+
+        tModel->setColumnCount(4 * domainLevels.size());
+        tModel->setRowCount(indexNumber);
+
+        for (int r = 0; r < domainLevels.size() + 1; ++r) {
+            QStandardItem *s = nullptr;
+            if (r < domainLevels.size()) {
+                s = new QStandardItem(QString("R%1").arg(r + 1));
+            } else {
+                s = new QStandardItem("Rp");
+            }
+
+            s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+            s->setTextAlignment(Qt::AlignCenter);
+            if (r < domainLevels.size()) {
+                s->setToolTip(QString("经典域R%1").arg(r + 1));
+            } else {
+                s->setToolTip("节域p");
+            }
+
+            tModel->setItem(0, r * 4, s);
+            table->setSpan(0, r * 4, indexNumber, 1);
+
+            if (r < domainLevels.size()) {
+                s = new QStandardItem(domainLevels.at(r));
+            } else {
+                s = new QStandardItem("节域p");
+            }
+
+            s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+            s->setTextAlignment(Qt::AlignCenter);
+            tModel->setItem(0, r * 4 + 1, s);
+            table->setSpan(0, r * 4 + 1, indexNumber, 1);
+
+            for (int k = 0; k < indexNumber; ++k) {
+                s = new QStandardItem(indexs[parentIndexs.at(pindex)].value(k));
+                s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+                s->setTextAlignment(Qt::AlignCenter);
+                tModel->setItem(k, r * 4 + 2, s);
+
+                s = new QStandardItem();
+                s->setTextAlignment(Qt::AlignCenter);
+                tModel->setItem(k, r * 4 + 3, s);
+            }
+        }
+
+        ui->tabWidget->addTab(table, parentIndexs.at(pindex));
+    }
+}
+
+QStringList MatterElementConfigWidget::getDomainLevels() const
+{
+    QStringList lvls;
+    for (int i = 0; i < m_levelEdits.size(); ++i) {
+        QString v = m_levelEdits.at(i)->text().trimmed();
+        if (v.isEmpty()) {
+            lvls << QString("E%1").arg(i + 1);
+        } else {
+            lvls << v;
+        }
+    }
+
+    return lvls;
+}
+
+void MatterElementConfigWidget::onLevelSaveBtnClick() { }

+ 49 - 0
QFD/widgets/MatterElementConfigWidget.h

@@ -0,0 +1,49 @@
+#ifndef MATTERELEMENTCONFIGWIDGET_H
+#define MATTERELEMENTCONFIGWIDGET_H
+
+#include <QLineEdit>
+#include <QStandardItemModel>
+#include <QWidget>
+
+struct MEDomain
+{
+    QString name;
+    double leftValue;
+    double rightValue;
+};
+
+struct MEConfigItem
+{
+    QString parentName;
+    QVector<MEDomain> childs;
+};
+
+namespace Ui {
+class MatterElementConfigWidget;
+}
+
+class MatterElementConfigWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    explicit MatterElementConfigWidget(QWidget *parent = nullptr);
+    ~MatterElementConfigWidget();
+
+private:
+    void initScaleDivisionTable();  // 标度划分表
+    void initDomainTable();         // 经典域、节域配置
+    QStringList getDomainLevels() const;
+
+private slots:
+    void onLevelSaveBtnClick();
+
+private:
+    Ui::MatterElementConfigWidget *ui;
+
+    QStandardItemModel *m_scaleDivisionmodel;
+
+    QList<QLineEdit *> m_levelEdits;
+};
+
+#endif  // MATTERELEMENTCONFIGWIDGET_H

+ 145 - 0
QFD/widgets/MatterElementConfigWidget.ui

@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MatterElementConfigWidget</class>
+ <widget class="QWidget" name="MatterElementConfigWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>600</width>
+    <height>600</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout" rowstretch="1,5,0">
+   <item row="0" column="0">
+    <widget class="QGroupBox" name="groupBox">
+     <property name="title">
+      <string>标度划分表</string>
+     </property>
+     <layout class="QHBoxLayout" name="horizontalLayout">
+      <item>
+       <widget class="QTableView" name="scaleDivisionTable">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item row="1" column="0">
+    <widget class="QGroupBox" name="groupBox_2">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="title">
+      <string>划分经典域/节域</string>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout">
+      <item>
+       <layout class="QHBoxLayout" name="horizontalLayout_2">
+        <item>
+         <widget class="QLabel" name="label">
+          <property name="font">
+           <font>
+            <family>微软雅黑 Light</family>
+            <pointsize>12</pointsize>
+            <weight>75</weight>
+            <bold>true</bold>
+           </font>
+          </property>
+          <property name="text">
+           <string>等级:</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QLabel" name="levelLabel">
+          <property name="font">
+           <font>
+            <family>Calibri</family>
+            <pointsize>12</pointsize>
+           </font>
+          </property>
+          <property name="text">
+           <string>3</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <spacer name="horizontalSpacer_2">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>352</width>
+            <height>20</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+       </layout>
+      </item>
+      <item>
+       <layout class="QHBoxLayout" name="horizontalLayout_3" stretch="0,6">
+        <item>
+         <widget class="QWidget" name="levelWidget" native="true"/>
+        </item>
+        <item>
+         <widget class="QTabWidget" name="tabWidget">
+          <property name="tabShape">
+           <enum>QTabWidget::Triangular</enum>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
+      <item>
+       <layout class="QHBoxLayout" name="horizontalLayout_4">
+        <item>
+         <spacer name="horizontalSpacer">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>397</width>
+            <height>20</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+        <item>
+         <widget class="QPushButton" name="cleanBtn">
+          <property name="text">
+           <string> 清理</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QPushButton" name="saveBtn">
+          <property name="text">
+           <string>保存</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 72 - 0
QFD/widgets/MatterElementItemDelegate.cpp

@@ -0,0 +1,72 @@
+#include "MatterElementItemDelegate.h"
+
+MatterElementItemSpinDelegate::MatterElementItemSpinDelegate(QObject *parent) : QStyledItemDelegate(parent) { }
+
+QWidget *MatterElementItemSpinDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem & /* option */,
+                                                     const QModelIndex & /* index */) const
+{
+    QDoubleSpinBox *editor = new QDoubleSpinBox(parent);
+
+    editor->setFrame(false);
+    editor->setMinimum(-10000);
+    editor->setMaximum(10000);
+    return editor;
+}
+
+void MatterElementItemSpinDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
+{
+    double value = index.model()->data(index, Qt::EditRole).toDouble();
+
+    QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox *>(editor);
+    spinBox->setValue(value);
+}
+
+void MatterElementItemSpinDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
+                                                 const QModelIndex &index) const
+{
+    QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox *>(editor);
+    spinBox->interpretText();
+    int value = spinBox->value();
+
+    model->setData(index, value, Qt::EditRole);
+}
+
+void MatterElementItemSpinDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
+                                                         const QModelIndex & /*index*/) const
+{
+    editor->setGeometry(option.rect);
+}
+
+MatterElementItemInsideDelegate::MatterElementItemInsideDelegate(QObject *parent) : QStyledItemDelegate(parent) { }
+
+QWidget *MatterElementItemInsideDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
+                                                       const QModelIndex & /*index*/) const
+{
+    InsideWidget *editor = new InsideWidget(parent);
+
+    return editor;
+}
+
+void MatterElementItemInsideDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
+{
+    QString value    = index.model()->data(index, Qt::EditRole).toString();
+    InsideWidget *iw = static_cast<InsideWidget *>(editor);
+    iw->setValue(value);
+}
+
+void MatterElementItemInsideDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
+                                                   const QModelIndex &index) const
+{
+    InsideWidget *iw = static_cast<InsideWidget *>(editor);
+    QString value    = iw->result();
+
+    model->setData(index, value, Qt::EditRole);
+}
+
+void MatterElementItemInsideDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
+                                                           const QModelIndex &index) const
+{
+    QRect rect = option.rect;
+    rect.adjust(-10, 0, 10, 50);
+    editor->setGeometry(rect);
+}

+ 98 - 0
QFD/widgets/MatterElementItemDelegate.h

@@ -0,0 +1,98 @@
+#ifndef MATTERELEMENTITEMDELEGATE_H
+#define MATTERELEMENTITEMDELEGATE_H
+
+#include <QStyledItemDelegate>
+#include <QFormLayout>
+#include <QDoubleSpinBox>
+
+class InsideWidget : public QFrame
+{
+    Q_OBJECT
+public:
+    InsideWidget(QWidget *parent = nullptr) : QFrame(parent)
+    {
+        QFormLayout *layout = new QFormLayout;
+        setStyleSheet("InsideWidget{background-color:gray} QLabel{color:white}");
+        layout->setMargin(10);
+        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);
+            m_spins << s;
+        }
+        layout->addRow("[很差,交差]中间值:", m_spins.at(0));
+        layout->addRow("[较差,一般]中间值:", m_spins.at(1));
+        layout->addRow("[一般,较高]中间值:", m_spins.at(2));
+        layout->addRow("[较高,很高]中间值:", m_spins.at(3));
+        setLayout(layout);
+    }
+    virtual ~InsideWidget() { }
+
+    QString result()
+    {
+        this->onConfirm();
+        return m_result;
+    }
+
+    void setValue(const QString &value)
+    {
+        if (!value.isEmpty()) {
+            QStringList tmp = value.mid(1, value.size() - 2).replace(" ", "").split(",");
+            for (int i = 0; i < tmp.size(); ++i) {
+                m_spins.at(i)->setValue(tmp[i].toDouble());
+            }
+        }
+    }
+
+private slots:
+    void onConfirm()
+    {
+        m_result = QString("[%1, %2, %3, %4]")
+                           .arg(m_spins.at(0)->value())
+                           .arg(m_spins.at(1)->value())
+                           .arg(m_spins.at(2)->value())
+                           .arg(m_spins.at(3)->value());
+    }
+
+private:
+    QList<QDoubleSpinBox *> m_spins;
+
+    QString m_result;
+};
+
+class MatterElementItemSpinDelegate : public QStyledItemDelegate
+{
+    Q_OBJECT
+
+public:
+    MatterElementItemSpinDelegate(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;
+};
+
+class MatterElementItemInsideDelegate : public QStyledItemDelegate
+{
+    Q_OBJECT
+
+public:
+    MatterElementItemInsideDelegate(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;
+};
+
+#endif  // MATTERELEMENTITEMDELEGATE_H