123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- #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);
- }
|