GreyClusteringConfigWidget.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #include "GreyClusteringConfigWidget.h"
  2. #include "GreyClusteringItemDelegate.h"
  3. #include "MultiLevelHeaderView.h"
  4. #include "ui_GreyClusteringConfigWidget.h"
  5. #include <QLineEdit>
  6. #include <QDebug>
  7. #include <QMessageBox>
  8. GreyClusteringConfigWidget::GreyClusteringConfigWidget(int grayNumber, QWidget *parent)
  9. : QWidget(parent), ui(new Ui::GreyClusteringConfigWidget), m_grayNumber(grayNumber)
  10. {
  11. ui->setupUi(this);
  12. ui->grayConfigTableView->setAlternatingRowColors(false);
  13. ui->grayConfigTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  14. ui->grayConfigTableView->horizontalHeader()->setStyleSheet(
  15. "QHeaderView::section{background:rgb(244,244,244);color: black;}");
  16. ui->grayConfigTableView->verticalHeader()->setStyleSheet(
  17. "QHeaderView::section{background:rgb(244,244,244);color: black;}");
  18. ui->grayConfigTableView->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
  19. ui->grayConfigTableView->setSelectionMode(QAbstractItemView::SingleSelection);
  20. m_model = new QStandardItemModel();
  21. ui->grayConfigTableView->setModel(m_model);
  22. ui->stackedWidget->setCurrentIndex(0);
  23. ui->grayNumber->setText(QString::number(grayNumber));
  24. initFormLayout();
  25. refreshTableView();
  26. resize(1200, 800);
  27. // ui->grayConfigTableView->setEditTriggers(QAbstractItemView::CurrentChanged); //单击触发
  28. }
  29. GreyClusteringConfigWidget::~GreyClusteringConfigWidget()
  30. {
  31. delete ui;
  32. }
  33. void GreyClusteringConfigWidget::initFormLayout()
  34. {
  35. for (int i = 0; i < m_grayNumber; ++i) {
  36. auto le = new QLineEdit;
  37. le->setPlaceholderText("请输入类别");
  38. le->setMinimumHeight(28);
  39. le->setMinimumWidth(200);
  40. ui->grayFormLayout->addRow(QString(tr("级别 %1:")).arg(i), le);
  41. }
  42. qDebug() << ui->grayFormLayout->rowCount();
  43. connect(ui->confirmBtn, &QPushButton::clicked, this, &GreyClusteringConfigWidget::onConfirmClick);
  44. }
  45. /**
  46. #if 0 // 竖直表头
  47. auto vHeader = new MultiLevelHeaderView(Qt::Vertical, 9, 3, t);
  48. vHeader->setColumnWidth(0, 40);
  49. vHeader->setColumnWidth(1, 40);
  50. vHeader->setColumnWidth(2, 80);
  51. vHeader->setCellSpan(0, 0, 9, 1);
  52. vHeader->setCellSpan(0, 1, 1, 2);
  53. vHeader->setCellSpan(1, 1, 3, 1);
  54. vHeader->setCellSpan(1, 2, 1, 1);
  55. vHeader->setCellSpan(2, 2, 1, 1);
  56. vHeader->setCellSpan(3, 2, 1, 1);
  57. vHeader->setCellSpan(4, 1, 1, 2);
  58. vHeader->setCellSpan(5, 1, 1, 2);
  59. vHeader->setCellSpan(6, 1, 1, 2);
  60. vHeader->setCellSpan(7, 1, 2, 1);
  61. vHeader->setCellSpan(7, 2, 1, 1);
  62. vHeader->setCellSpan(8, 2, 1, 1);
  63. vHeader->setCellText(0, 0, "火力");
  64. vHeader->setCellText(0, 1, "火炮口径");
  65. vHeader->setCellText(1, 1, "初速");
  66. vHeader->setCellText(1, 2, "穿甲弹");
  67. vHeader->setCellText(2, 2, "破甲弹");
  68. vHeader->setCellText(3, 2, "榴弹");
  69. vHeader->setCellText(4, 1, "首发命中率");
  70. vHeader->setCellText(5, 1, "直射距离");
  71. vHeader->setCellText(6, 1, "弹药基数");
  72. vHeader->setCellText(7, 1, "时间");
  73. vHeader->setCellText(7, 2, "静对静");
  74. vHeader->setCellText(8, 2, "静对动");
  75. t->setVerticalHeader(vHeader);
  76. #endif
  77. */
  78. struct IndexItem
  79. {
  80. QString name;
  81. int row;
  82. int col;
  83. int rowSpan;
  84. int colSpan;
  85. };
  86. void GreyClusteringConfigWidget::refreshTableView()
  87. {
  88. int rows = 9;
  89. int cols = 9;
  90. const int nodeDepth = 3; // 节点深度
  91. m_grayNames = QStringList { "较差类", "一般类", "较好类" };
  92. QTableView *t = ui->grayConfigTableView;
  93. m_model->clear();
  94. // 设置表头
  95. {
  96. auto hHeader = new MultiLevelHeaderView(Qt::Horizontal, 2, nodeDepth + 3 + m_grayNames.size(), t);
  97. hHeader->setCellSpan(0, 0, 2, nodeDepth); // 指标占位
  98. for (int n = 0; n < 1 + m_grayNames.size(); ++n) { // 单位+灰度级占位
  99. hHeader->setCellSpan(0, nodeDepth + n, 2, 1);
  100. }
  101. hHeader->setCellSpan(0, nodeDepth + 1 + m_grayNames.size(), 1, 2); // 延拓值占位
  102. hHeader->setCellSpan(1, nodeDepth + 1 + m_grayNames.size(), 1, 1);
  103. hHeader->setCellSpan(1, nodeDepth + 1 + m_grayNames.size() + 1, 1, 1);
  104. // 一级
  105. hHeader->setCellText(0, 0, QString("指标"));
  106. hHeader->setCellText(0, nodeDepth, QString("单位"));
  107. for (int i = 0; i < m_grayNames.size(); ++i) {
  108. hHeader->setCellText(0, nodeDepth + 1 + i, m_grayNames.at(i));
  109. }
  110. hHeader->setCellText(0, nodeDepth + 1 + m_grayNames.size(), QString("延拓值"));
  111. // 二级
  112. hHeader->setCellText(1, nodeDepth + 1 + m_grayNames.size(), "左");
  113. hHeader->setCellText(1, nodeDepth + 2 + m_grayNames.size(), "右");
  114. t->setHorizontalHeader(hHeader);
  115. }
  116. QVector<IndexItem> items;
  117. items << IndexItem { "火力", 0, 0, 9, 1 };
  118. items << IndexItem { "火炮口径", 0, 1, 1, 2 };
  119. items << IndexItem { "初速", 1, 1, 3, 1 };
  120. items << IndexItem { "穿甲弹", 1, 2, 1, 1 };
  121. items << IndexItem { "破甲弹", 2, 2, 1, 1 };
  122. items << IndexItem { "榴弹", 3, 2, 1, 1 };
  123. items << IndexItem { "首发命中", 4, 1, 1, 2 };
  124. items << IndexItem { "直射距离", 5, 1, 1, 2 };
  125. items << IndexItem { "弹药基数", 6, 1, 1, 2 };
  126. items << IndexItem { "时间", 7, 1, 2, 1 };
  127. items << IndexItem { "静对静", 7, 2, 1, 1 };
  128. items << IndexItem { "静对动", 8, 2, 1, 1 };
  129. m_model->setColumnCount(nodeDepth + 3 + m_grayNames.size());
  130. m_model->setRowCount(9); // 最大9行
  131. for (auto &item : items) {
  132. auto s = new QStandardItem(item.name);
  133. s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
  134. s->setTextAlignment(Qt::AlignCenter);
  135. s->setToolTip(item.name);
  136. m_model->setItem(item.row, item.col, s);
  137. if (item.rowSpan > 1 || item.colSpan > 1) {
  138. t->setSpan(item.row, item.col, item.rowSpan, item.colSpan);
  139. }
  140. }
  141. for (int r = 0; r < m_model->rowCount(); ++r) {
  142. for (int c = nodeDepth; c < m_model->columnCount(); ++c) {
  143. auto s = new QStandardItem();
  144. s->setTextAlignment(Qt::AlignCenter);
  145. m_model->setItem(r, c, s);
  146. }
  147. }
  148. for (int c = 0; c < m_grayNames.size(); ++c) {
  149. t->setItemDelegateForColumn(c + nodeDepth + 1, new GreyClusteringItemRangeDelegate(t));
  150. }
  151. for (int c = m_grayNames.size(); c < m_grayNames.size() + 2; ++c) {
  152. t->setItemDelegateForColumn(c + nodeDepth + 1, new GreyClusteringItemSpinDelegate(t));
  153. }
  154. }
  155. void GreyClusteringConfigWidget::onConfirmClick()
  156. {
  157. QStringList names;
  158. for (int i = 0; i < m_grayNumber; ++i) {
  159. QLayoutItem *item = ui->grayFormLayout->itemAt(i + 1, QFormLayout::FieldRole);
  160. QLineEdit *le = qobject_cast<QLineEdit *>(item->widget());
  161. if (le) {
  162. if (le->text().trimmed().isEmpty()) {
  163. QMessageBox::warning(this, tr("警告"), tr("类别%1不能为空!").arg(i));
  164. return;
  165. }
  166. names << le->text().trimmed();
  167. }
  168. }
  169. if (names.toSet().size() != m_grayNumber) {
  170. QMessageBox::warning(this, tr("警告"), tr("类别名不能重复!"));
  171. return;
  172. }
  173. m_grayNames = names;
  174. refreshTableView();
  175. ui->stackedWidget->setCurrentIndex(1);
  176. }