#include "GreyClusteringConfigWidget.h" #include "GreyClusteringItemDelegate.h" #include "MultiLevelHeaderView.h" #include "ui_GreyClusteringConfigWidget.h" #include #include #include GreyClusteringConfigWidget::GreyClusteringConfigWidget(int grayNumber, QWidget *parent) : QWidget(parent), ui(new Ui::GreyClusteringConfigWidget), m_grayNumber(grayNumber) { ui->setupUi(this); ui->grayConfigTableView->setAlternatingRowColors(false); ui->grayConfigTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); ui->grayConfigTableView->horizontalHeader()->setStyleSheet( "QHeaderView::section{background:rgb(244,244,244);color: black;}"); ui->grayConfigTableView->verticalHeader()->setStyleSheet( "QHeaderView::section{background:rgb(244,244,244);color: black;}"); ui->grayConfigTableView->verticalHeader()->setDefaultAlignment(Qt::AlignCenter); ui->grayConfigTableView->setSelectionMode(QAbstractItemView::SingleSelection); m_model = new QStandardItemModel(); ui->grayConfigTableView->setModel(m_model); ui->stackedWidget->setCurrentIndex(0); ui->grayNumber->setText(QString::number(grayNumber)); initFormLayout(); refreshTableView(); resize(1200, 800); // ui->grayConfigTableView->setEditTriggers(QAbstractItemView::CurrentChanged); //单击触发 } GreyClusteringConfigWidget::~GreyClusteringConfigWidget() { delete ui; } void GreyClusteringConfigWidget::initFormLayout() { for (int i = 0; i < m_grayNumber; ++i) { auto le = new QLineEdit; le->setPlaceholderText("请输入类别"); le->setMinimumHeight(28); le->setMinimumWidth(200); ui->grayFormLayout->addRow(QString(tr("级别 %1:")).arg(i), le); } qDebug() << ui->grayFormLayout->rowCount(); connect(ui->confirmBtn, &QPushButton::clicked, this, &GreyClusteringConfigWidget::onConfirmClick); } /** #if 0 // 竖直表头 auto vHeader = new MultiLevelHeaderView(Qt::Vertical, 9, 3, t); vHeader->setColumnWidth(0, 40); vHeader->setColumnWidth(1, 40); vHeader->setColumnWidth(2, 80); vHeader->setCellSpan(0, 0, 9, 1); vHeader->setCellSpan(0, 1, 1, 2); vHeader->setCellSpan(1, 1, 3, 1); vHeader->setCellSpan(1, 2, 1, 1); vHeader->setCellSpan(2, 2, 1, 1); vHeader->setCellSpan(3, 2, 1, 1); vHeader->setCellSpan(4, 1, 1, 2); vHeader->setCellSpan(5, 1, 1, 2); vHeader->setCellSpan(6, 1, 1, 2); vHeader->setCellSpan(7, 1, 2, 1); vHeader->setCellSpan(7, 2, 1, 1); vHeader->setCellSpan(8, 2, 1, 1); vHeader->setCellText(0, 0, "火力"); vHeader->setCellText(0, 1, "火炮口径"); vHeader->setCellText(1, 1, "初速"); vHeader->setCellText(1, 2, "穿甲弹"); vHeader->setCellText(2, 2, "破甲弹"); vHeader->setCellText(3, 2, "榴弹"); vHeader->setCellText(4, 1, "首发命中率"); vHeader->setCellText(5, 1, "直射距离"); vHeader->setCellText(6, 1, "弹药基数"); vHeader->setCellText(7, 1, "时间"); vHeader->setCellText(7, 2, "静对静"); vHeader->setCellText(8, 2, "静对动"); t->setVerticalHeader(vHeader); #endif */ struct IndexItem { QString name; int row; int col; int rowSpan; int colSpan; }; void GreyClusteringConfigWidget::refreshTableView() { int rows = 9; int cols = 9; const int nodeDepth = 3; // 节点深度 m_grayNames = QStringList { "较差类", "一般类", "较好类" }; QTableView *t = ui->grayConfigTableView; m_model->clear(); // 设置表头 { auto hHeader = new MultiLevelHeaderView(Qt::Horizontal, 2, nodeDepth + 3 + m_grayNames.size(), t); hHeader->setCellSpan(0, 0, 2, nodeDepth); // 指标占位 for (int n = 0; n < 1 + m_grayNames.size(); ++n) { // 单位+灰度级占位 hHeader->setCellSpan(0, nodeDepth + n, 2, 1); } hHeader->setCellSpan(0, nodeDepth + 1 + m_grayNames.size(), 1, 2); // 延拓值占位 hHeader->setCellSpan(1, nodeDepth + 1 + m_grayNames.size(), 1, 1); hHeader->setCellSpan(1, nodeDepth + 1 + m_grayNames.size() + 1, 1, 1); // 一级 hHeader->setCellText(0, 0, QString("指标")); hHeader->setCellText(0, nodeDepth, QString("单位")); for (int i = 0; i < m_grayNames.size(); ++i) { hHeader->setCellText(0, nodeDepth + 1 + i, m_grayNames.at(i)); } hHeader->setCellText(0, nodeDepth + 1 + m_grayNames.size(), QString("延拓值")); // 二级 hHeader->setCellText(1, nodeDepth + 1 + m_grayNames.size(), "左"); hHeader->setCellText(1, nodeDepth + 2 + m_grayNames.size(), "右"); t->setHorizontalHeader(hHeader); } QVector items; items << IndexItem { "火力", 0, 0, 9, 1 }; items << IndexItem { "火炮口径", 0, 1, 1, 2 }; items << IndexItem { "初速", 1, 1, 3, 1 }; items << IndexItem { "穿甲弹", 1, 2, 1, 1 }; items << IndexItem { "破甲弹", 2, 2, 1, 1 }; items << IndexItem { "榴弹", 3, 2, 1, 1 }; items << IndexItem { "首发命中", 4, 1, 1, 2 }; items << IndexItem { "直射距离", 5, 1, 1, 2 }; items << IndexItem { "弹药基数", 6, 1, 1, 2 }; items << IndexItem { "时间", 7, 1, 2, 1 }; items << IndexItem { "静对静", 7, 2, 1, 1 }; items << IndexItem { "静对动", 8, 2, 1, 1 }; m_model->setColumnCount(nodeDepth + 3 + m_grayNames.size()); m_model->setRowCount(9); // 最大9行 for (auto &item : items) { auto s = new QStandardItem(item.name); s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); s->setTextAlignment(Qt::AlignCenter); s->setToolTip(item.name); m_model->setItem(item.row, item.col, s); if (item.rowSpan > 1 || item.colSpan > 1) { t->setSpan(item.row, item.col, item.rowSpan, item.colSpan); } } for (int r = 0; r < m_model->rowCount(); ++r) { for (int c = nodeDepth; c < m_model->columnCount(); ++c) { auto s = new QStandardItem(); s->setTextAlignment(Qt::AlignCenter); m_model->setItem(r, c, s); } } for (int c = 0; c < m_grayNames.size(); ++c) { t->setItemDelegateForColumn(c + nodeDepth + 1, new GreyClusteringItemRangeDelegate(t)); } for (int c = m_grayNames.size(); c < m_grayNames.size() + 2; ++c) { t->setItemDelegateForColumn(c + nodeDepth + 1, new GreyClusteringItemSpinDelegate(t)); } } void GreyClusteringConfigWidget::onConfirmClick() { QStringList names; for (int i = 0; i < m_grayNumber; ++i) { QLayoutItem *item = ui->grayFormLayout->itemAt(i + 1, QFormLayout::FieldRole); QLineEdit *le = qobject_cast(item->widget()); if (le) { if (le->text().trimmed().isEmpty()) { QMessageBox::warning(this, tr("警告"), tr("类别%1不能为空!").arg(i)); return; } names << le->text().trimmed(); } } if (names.toSet().size() != m_grayNumber) { QMessageBox::warning(this, tr("警告"), tr("类别名不能重复!")); return; } m_grayNames = names; refreshTableView(); ui->stackedWidget->setCurrentIndex(1); }