#include "GreyClusteringItemDelegate.h" #include "GreyClusteringSampleTable.h" #include "MultiLevelHeaderView.h" #include #include /** * example * QVector gcItems; gcItems << GreyClusteringItem { "火力", 0, 0, 9, 1, nullptr }; QSharedPointer sg = QSharedPointer(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(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(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(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(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(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(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(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(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 &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); }