|
@@ -0,0 +1,260 @@
|
|
|
+#include "GreyClusteringItemDelegate.h"
|
|
|
+#include "GreyClusteringSampleTable.h"
|
|
|
+#include "MultiLevelHeaderView.h"
|
|
|
+
|
|
|
+#include <QHeaderView>
|
|
|
+#include <QDebug>
|
|
|
+
|
|
|
+/**
|
|
|
+ * example
|
|
|
+ * QVector<GreyClusteringItem> gcItems;
|
|
|
+ gcItems << GreyClusteringItem { "火力", 0, 0, 9, 1, nullptr };
|
|
|
+ QSharedPointer<GreyClusteringValue> sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
|
|
|
+ sg->units = "m";
|
|
|
+ sg->weiget = 2;
|
|
|
+ sg->greyRanges << GreyRange { "较差类", true, 85, true, 100 };
|
|
|
+ sg->greyRanges << GreyRange { "一般类", true, 100, true, 115 };
|
|
|
+ sg->greyRanges << GreyRange { "较好类", true, 115, true, 125 };
|
|
|
+ sg->leftExtension = 70;
|
|
|
+ sg->rightExtension = 140;
|
|
|
+ sg->oldValue = 0;
|
|
|
+ sg->newValue = 0;
|
|
|
+ gcItems << GreyClusteringItem { "火炮口径", 0, 1, 1, 2, sg };
|
|
|
+
|
|
|
+ gcItems << GreyClusteringItem { "初速", 1, 1, 3, 1, nullptr };
|
|
|
+
|
|
|
+ sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
|
|
|
+ sg->units = "m";
|
|
|
+ sg->weiget = 4;
|
|
|
+ sg->greyRanges << GreyRange { "较差类", true, 1600, true, 1300 };
|
|
|
+ sg->greyRanges << GreyRange { "一般类", true, 1600, true, 1900 };
|
|
|
+ sg->greyRanges << GreyRange { "较好类", true, 1600, true, 1900 };
|
|
|
+ sg->leftExtension = 500;
|
|
|
+ sg->rightExtension = 220;
|
|
|
+ sg->oldValue = 0;
|
|
|
+ sg->newValue = 0;
|
|
|
+ gcItems << GreyClusteringItem { "穿甲弹", 1, 2, 1, 1, sg };
|
|
|
+
|
|
|
+ sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
|
|
|
+ sg->units = "m";
|
|
|
+ sg->weiget = 4;
|
|
|
+ sg->greyRanges << GreyRange { "较差类", true, 1000, true, 1200 };
|
|
|
+ sg->greyRanges << GreyRange { "一般类", true, 1200, true, 1400 };
|
|
|
+ sg->greyRanges << GreyRange { "较好类", true, 1200, true, 1400 };
|
|
|
+ sg->leftExtension = 600;
|
|
|
+ sg->rightExtension = 1700;
|
|
|
+ sg->oldValue = 0;
|
|
|
+ sg->newValue = 0;
|
|
|
+ gcItems << GreyClusteringItem { "破甲弹", 2, 2, 1, 1, sg };
|
|
|
+
|
|
|
+ sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
|
|
|
+ sg->units = "m";
|
|
|
+ sg->weiget = 4;
|
|
|
+ sg->greyRanges << GreyRange { "较差类", true, 500, false, 650 };
|
|
|
+ sg->greyRanges << GreyRange { "一般类", true, 650, false, 800 };
|
|
|
+ sg->greyRanges << GreyRange { "较好类", true, 800, false, 1000 };
|
|
|
+ sg->leftExtension = 400;
|
|
|
+ sg->rightExtension = 1100;
|
|
|
+ sg->oldValue = 0;
|
|
|
+ sg->newValue = 0;
|
|
|
+ gcItems << GreyClusteringItem { "榴弹", 3, 2, 1, 1, sg };
|
|
|
+
|
|
|
+ sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
|
|
|
+ sg->units = "";
|
|
|
+ sg->weiget = 5;
|
|
|
+ sg->greyRanges << GreyRange { "较差类", true, 0.5, false, 0.65 };
|
|
|
+ sg->greyRanges << GreyRange { "一般类", true, 0.65, false, 0.75 };
|
|
|
+ sg->greyRanges << GreyRange { "较好类", true, 0.75, false, 0.9 };
|
|
|
+ sg->leftExtension = 0.45;
|
|
|
+ sg->rightExtension = 0.95;
|
|
|
+ sg->oldValue = 0;
|
|
|
+ sg->newValue = 0;
|
|
|
+ gcItems << GreyClusteringItem { "首发命中", 4, 1, 1, 2, sg };
|
|
|
+
|
|
|
+ sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
|
|
|
+ sg->units = "m";
|
|
|
+ sg->weiget = 5;
|
|
|
+ sg->greyRanges << GreyRange { "较差类", true, 800, false, 1200 };
|
|
|
+ sg->greyRanges << GreyRange { "一般类", true, 1200, false, 1600 };
|
|
|
+ sg->greyRanges << GreyRange { "较好类", true, 1600, false, 2200 };
|
|
|
+ sg->leftExtension = 500;
|
|
|
+ sg->rightExtension = 2500;
|
|
|
+ sg->oldValue = 0;
|
|
|
+ sg->newValue = 0;
|
|
|
+ gcItems << GreyClusteringItem { "直射距离", 5, 1, 1, 2, sg };
|
|
|
+
|
|
|
+ sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
|
|
|
+ sg->units = "发";
|
|
|
+ sg->weiget = 3;
|
|
|
+ sg->greyRanges << GreyRange { "较差类", true, 30, false, 40 };
|
|
|
+ sg->greyRanges << GreyRange { "一般类", true, 40, false, 50 };
|
|
|
+ sg->greyRanges << GreyRange { "较好类", true, 50, false, 65 };
|
|
|
+ sg->leftExtension = 28;
|
|
|
+ sg->rightExtension = 70;
|
|
|
+ sg->oldValue = 0;
|
|
|
+ sg->newValue = 0;
|
|
|
+ gcItems << GreyClusteringItem { "弹药基数", 6, 1, 1, 2, sg };
|
|
|
+ gcItems << GreyClusteringItem { "时间", 7, 1, 2, 1, nullptr };
|
|
|
+
|
|
|
+ sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
|
|
|
+ sg->units = "s";
|
|
|
+ sg->weiget = 3;
|
|
|
+ sg->greyRanges << GreyRange { "较差类", true, 11, false, 10 };
|
|
|
+ sg->greyRanges << GreyRange { "一般类", true, 10, false, 7 };
|
|
|
+ sg->greyRanges << GreyRange { "较好类", true, 7, false, 4 };
|
|
|
+ sg->leftExtension = 12;
|
|
|
+ sg->rightExtension = 3;
|
|
|
+ sg->oldValue = 0;
|
|
|
+ sg->newValue = 0;
|
|
|
+ gcItems << GreyClusteringItem { "静对静", 7, 2, 1, 1, sg };
|
|
|
+
|
|
|
+ sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
|
|
|
+ sg->units = "s";
|
|
|
+ sg->weiget = 3;
|
|
|
+ sg->greyRanges << GreyRange { "较差类", true, 14, false, 12 };
|
|
|
+ sg->greyRanges << GreyRange { "一般类", true, 12, false, 10 };
|
|
|
+ sg->greyRanges << GreyRange { "较好类", true, 10, false, 7 };
|
|
|
+ sg->leftExtension = 15;
|
|
|
+ sg->rightExtension = 5;
|
|
|
+ sg->oldValue = 0;
|
|
|
+ sg->newValue = 0;
|
|
|
+ gcItems << GreyClusteringItem { "静对动", 8, 2, 1, 1, sg };
|
|
|
+
|
|
|
+ GreyClusteringSampleTable gcst(gcItems, 3, 9);
|
|
|
+ gcst.resize(1200, 800);
|
|
|
+ gcst.refreshTableView();
|
|
|
+ gcst.show();
|
|
|
+ */
|
|
|
+
|
|
|
+GreyClusteringSampleTable::GreyClusteringSampleTable(const QVector<GreyClusteringItem> &gcItems, int nodeDepth,
|
|
|
+ int rowNodes, QWidget *parent)
|
|
|
+ : QTableView(parent), m_greyClusterings(gcItems), m_nodeDepth(nodeDepth), m_rowNodes(rowNodes)
|
|
|
+{
|
|
|
+ m_model = new QStandardItemModel();
|
|
|
+ this->setModel(m_model);
|
|
|
+
|
|
|
+ init();
|
|
|
+}
|
|
|
+
|
|
|
+void GreyClusteringSampleTable::refreshTableView()
|
|
|
+{
|
|
|
+ m_model->clear();
|
|
|
+
|
|
|
+ if (m_greyClusterings.size() == 0) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ QStringList greyNames; // 灰数
|
|
|
+ for (auto &item : m_greyClusterings) {
|
|
|
+ if (!item.value.isNull()) {
|
|
|
+ for (const auto &s : item.value->greyRanges) {
|
|
|
+ greyNames << s.name;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ int colCount = m_nodeDepth + 6 + greyNames.size();
|
|
|
+
|
|
|
+ // 设置表头
|
|
|
+ {
|
|
|
+ auto hHeader = new MultiLevelHeaderView(Qt::Horizontal, 2, colCount, this);
|
|
|
+ hHeader->setSectionResizeMode(QHeaderView::Stretch);
|
|
|
+
|
|
|
+ hHeader->setCellSpan(0, 0, 2, m_nodeDepth); // 指标占位
|
|
|
+ for (int n = 0; n < 2 + greyNames.size(); ++n) { // 单位+权重+灰度级占位
|
|
|
+ hHeader->setCellSpan(0, m_nodeDepth + n, 2, 1);
|
|
|
+ }
|
|
|
+ hHeader->setCellSpan(0, m_nodeDepth + 2 + greyNames.size(), 1, 2); // 延拓值占位
|
|
|
+ hHeader->setCellSpan(1, m_nodeDepth + 2 + greyNames.size(), 1, 1);
|
|
|
+ hHeader->setCellSpan(1, m_nodeDepth + 2 + greyNames.size() + 1, 1, 1);
|
|
|
+
|
|
|
+ hHeader->setCellSpan(0, m_nodeDepth + 4 + greyNames.size(), 1, 2); // 实现值占位
|
|
|
+ hHeader->setCellSpan(1, m_nodeDepth + 4 + greyNames.size(), 1, 1);
|
|
|
+ hHeader->setCellSpan(1, m_nodeDepth + 4 + greyNames.size() + 1, 1, 1);
|
|
|
+
|
|
|
+ // 一级
|
|
|
+ hHeader->setCellText(0, 0, QString("指标"));
|
|
|
+ hHeader->setCellText(0, m_nodeDepth, QString("单位"));
|
|
|
+ hHeader->setCellText(0, m_nodeDepth + 1, QString("权重"));
|
|
|
+ for (int i = 0; i < greyNames.size(); ++i) {
|
|
|
+ hHeader->setCellText(0, m_nodeDepth + 2 + i, greyNames.at(i));
|
|
|
+ }
|
|
|
+ hHeader->setCellText(0, m_nodeDepth + 2 + greyNames.size(), QString("延拓值"));
|
|
|
+ hHeader->setCellText(0, m_nodeDepth + 4 + greyNames.size(), QString("实现值"));
|
|
|
+ // 二级
|
|
|
+ hHeader->setCellText(1, m_nodeDepth + 2 + greyNames.size(), "左");
|
|
|
+ hHeader->setCellText(1, m_nodeDepth + 3 + greyNames.size(), "右");
|
|
|
+ hHeader->setCellText(1, m_nodeDepth + 4 + greyNames.size(), "改前");
|
|
|
+ hHeader->setCellText(1, m_nodeDepth + 5 + greyNames.size(), "改后");
|
|
|
+
|
|
|
+ this->setHorizontalHeader(hHeader);
|
|
|
+ }
|
|
|
+
|
|
|
+ m_model->setColumnCount(colCount);
|
|
|
+ m_model->setRowCount(m_rowNodes);
|
|
|
+
|
|
|
+ for (const auto &item : m_greyClusterings) {
|
|
|
+ // 第一步,设置指标名
|
|
|
+ auto s = new QStandardItem(item.indexName);
|
|
|
+ s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
|
|
|
+ s->setTextAlignment(Qt::AlignCenter);
|
|
|
+ s->setToolTip(item.indexName);
|
|
|
+ m_model->setItem(item.row, item.col, s);
|
|
|
+ if (item.rowSpan > 1 || item.colSpan > 1) {
|
|
|
+ this->setSpan(item.row, item.col, item.rowSpan, item.colSpan);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 第二步,查看当前指标下是否附带值
|
|
|
+
|
|
|
+ if (!item.value.isNull()) {
|
|
|
+ int offset = item.colSpan;
|
|
|
+ m_model->setItem(item.row, item.col + offset, new QStandardItem(item.value->units)); // 单位
|
|
|
+ ++offset;
|
|
|
+ m_model->setItem(item.row, item.col + offset,
|
|
|
+ new QStandardItem(QString::number(item.value->weiget))); // 权重
|
|
|
+ ++offset;
|
|
|
+ for (auto &range : item.value->greyRanges) { // 灰度级
|
|
|
+ QString r;
|
|
|
+ r += range.leftClose ? "[" : "(";
|
|
|
+ r += QString("%1, %2").arg(range.leftValue).arg(range.rightValue);
|
|
|
+ r += range.rightClose ? "]" : ")";
|
|
|
+ m_model->setItem(item.row, item.col + offset, new QStandardItem(r));
|
|
|
+ ++offset;
|
|
|
+ }
|
|
|
+ m_model->setItem(item.row, item.col + offset,
|
|
|
+ new QStandardItem(QString::number(item.value->leftExtension))); // 延拓值左
|
|
|
+ ++offset;
|
|
|
+ m_model->setItem(item.row, item.col + offset,
|
|
|
+ new QStandardItem(QString::number(item.value->rightExtension))); // 延拓值右
|
|
|
+ ++offset;
|
|
|
+ m_model->setItem(item.row, item.col + offset,
|
|
|
+ new QStandardItem(QString::number(item.value->oldValue))); // 实现值前
|
|
|
+ ++offset;
|
|
|
+ m_model->setItem(item.row, item.col + offset,
|
|
|
+ new QStandardItem(QString::number(item.value->newValue))); // 实现值后
|
|
|
+
|
|
|
+ ++offset;
|
|
|
+
|
|
|
+ for (int c = item.colSpan; c < offset - 2; ++c) {
|
|
|
+ m_model->item(item.row, item.col + c)->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
|
|
|
+ m_model->item(item.row, item.col + c)->setTextAlignment(Qt::AlignCenter);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int c = offset - 2; c < offset; ++c) {
|
|
|
+ m_model->item(item.row, item.col + c)->setTextAlignment(Qt::AlignCenter);
|
|
|
+ this->setItemDelegateForColumn(item.col + c, new GreyClusteringItemSpinDelegate(this));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void GreyClusteringSampleTable::init()
|
|
|
+{
|
|
|
+ setAlternatingRowColors(false);
|
|
|
+ horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
|
|
|
+ horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
|
|
|
+ verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
|
|
|
+ verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
|
|
|
+ setSelectionMode(QAbstractItemView::SingleSelection);
|
|
|
+}
|