GreyClusteringConfigWidget.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. #include "GreyClusteringConfigWidget.h"
  2. #include "GreyClusteringItemDelegate.h"
  3. #include "MultiLevelHeaderView.h"
  4. #include "ui_GreyClusteringConfigWidget.h"
  5. #include "dbService/GradeInfoService.h"
  6. #include "CMind.h"
  7. #include <QLineEdit>
  8. #include <QDebug>
  9. #include <QMessageBox>
  10. GreyClusteringConfigWidget::GreyClusteringConfigWidget(CMind *mind, int grayNumber, QWidget *parent)
  11. : QWidget(parent), ui(new Ui::GreyClusteringConfigWidget), m_mind(mind), m_grayNumber(grayNumber)
  12. {
  13. ui->setupUi(this);
  14. ui->grayConfigTableView->setAlternatingRowColors(false);
  15. ui->grayConfigTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
  16. ui->grayConfigTableView->horizontalHeader()->setStyleSheet(
  17. "QHeaderView::section{background:rgb(244,244,244);color: black;}");
  18. ui->grayConfigTableView->verticalHeader()->setStyleSheet(
  19. "QHeaderView::section{background:rgb(244,244,244);color: black;}");
  20. ui->grayConfigTableView->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
  21. ui->grayConfigTableView->setSelectionMode(QAbstractItemView::SingleSelection);
  22. // ui->grayConfigTableView->verticalHeader()->setDefaultSectionSize(20);
  23. ui->grayConfigTableView->horizontalHeader()->hide();
  24. m_model = new QStandardItemModel();
  25. ui->grayConfigTableView->setModel(m_model);
  26. ui->stackedWidget->setCurrentIndex(0);
  27. ui->grayNumber->setText(QString::number(grayNumber));
  28. initFormLayout();
  29. refreshTableView();
  30. resize(1200, 800);
  31. // ui->grayConfigTableView->setEditTriggers(QAbstractItemView::CurrentChanged); //单击触发
  32. }
  33. GreyClusteringConfigWidget::~GreyClusteringConfigWidget()
  34. {
  35. delete ui;
  36. }
  37. void GreyClusteringConfigWidget::initFormLayout()
  38. {
  39. QList<GradeInfo *> gradeInfoList;
  40. QMap<QString, QString> grayLevelMaps;
  41. int projectId = m_mind->root().projectId;
  42. if (!GradeInfoService().QueryGradeByProjectIdAndType(&gradeInfoList, projectId, 1)) {
  43. QMessageBox::warning(this, "警告", "数据库访问失败");
  44. } else {
  45. if (gradeInfoList.size() == 0) {
  46. for (int lvl = 0; lvl < m_grayNumber; ++lvl) {
  47. grayLevelMaps.insert(QString("级别 %1:").arg(lvl + 1), QString("E%1").arg(lvl + 1));
  48. GradeInfo ginfo;
  49. ginfo.projectId = projectId;
  50. ginfo.gradeName = QString("级别 %1").arg(lvl + 1);
  51. ginfo.gradeValue = QString("灰类%1级").arg(lvl + 1);
  52. ginfo.type = 1;
  53. if (!GradeInfoService().AddGradeInfo(ginfo)) {
  54. QMessageBox::warning(this, "警告", "数据库访问失败");
  55. }
  56. }
  57. } else {
  58. for (const auto &gi : gradeInfoList) {
  59. grayLevelMaps.insert(gi->gradeName, gi->gradeValue);
  60. if (grayLevelMaps.size() >= m_grayNumber) {
  61. break;
  62. }
  63. }
  64. // 缺少再补
  65. for (int lvl = grayLevelMaps.size(); lvl < m_grayNumber; ++lvl) {
  66. grayLevelMaps.insert(QString("级别 %1:").arg(lvl + 1), QString("E%1").arg(lvl + 1));
  67. GradeInfo ginfo;
  68. ginfo.projectId = projectId;
  69. ginfo.gradeName = QString("级别 %1").arg(lvl + 1);
  70. ginfo.gradeValue = QString("灰类%1级").arg(lvl + 1);
  71. ginfo.type = 0;
  72. if (!GradeInfoService().AddGradeInfo(ginfo)) {
  73. QMessageBox::warning(this, "警告", "数据库访问失败");
  74. }
  75. }
  76. m_grayNames = grayLevelMaps.values();
  77. ui->stackedWidget->setCurrentIndex(1);
  78. }
  79. }
  80. qDeleteAll(gradeInfoList);
  81. QMapIterator<QString, QString> iter(grayLevelMaps);
  82. while (iter.hasNext()) {
  83. iter.next();
  84. auto le = new QLineEdit;
  85. le->setPlaceholderText("请输入类别");
  86. le->setText(iter.value());
  87. le->setMinimumHeight(28);
  88. le->setMinimumWidth(200);
  89. ui->grayFormLayout->addRow(iter.key() + ":", le);
  90. }
  91. qDebug() << ui->grayFormLayout->rowCount();
  92. connect(ui->graySaveBtn, &QToolButton::clicked, this, &GreyClusteringConfigWidget::onConfirmClick);
  93. connect(ui->editGrayBtn, &QToolButton::clicked, [=]() { ui->stackedWidget->setCurrentIndex(0); });
  94. }
  95. /**
  96. #if 0 // 竖直表头
  97. auto vHeader = new MultiLevelHeaderView(Qt::Vertical, 9, 3, t);
  98. vHeader->setColumnWidth(0, 40);
  99. vHeader->setColumnWidth(1, 40);
  100. vHeader->setColumnWidth(2, 80);
  101. vHeader->setCellSpan(0, 0, 9, 1);
  102. vHeader->setCellSpan(0, 1, 1, 2);
  103. vHeader->setCellSpan(1, 1, 3, 1);
  104. vHeader->setCellSpan(1, 2, 1, 1);
  105. vHeader->setCellSpan(2, 2, 1, 1);
  106. vHeader->setCellSpan(3, 2, 1, 1);
  107. vHeader->setCellSpan(4, 1, 1, 2);
  108. vHeader->setCellSpan(5, 1, 1, 2);
  109. vHeader->setCellSpan(6, 1, 1, 2);
  110. vHeader->setCellSpan(7, 1, 2, 1);
  111. vHeader->setCellSpan(7, 2, 1, 1);
  112. vHeader->setCellSpan(8, 2, 1, 1);
  113. vHeader->setCellText(0, 0, "火力");
  114. vHeader->setCellText(0, 1, "火炮口径");
  115. vHeader->setCellText(1, 1, "初速");
  116. vHeader->setCellText(1, 2, "穿甲弹");
  117. vHeader->setCellText(2, 2, "破甲弹");
  118. vHeader->setCellText(3, 2, "榴弹");
  119. vHeader->setCellText(4, 1, "首发命中率");
  120. vHeader->setCellText(5, 1, "直射距离");
  121. vHeader->setCellText(6, 1, "弹药基数");
  122. vHeader->setCellText(7, 1, "时间");
  123. vHeader->setCellText(7, 2, "静对静");
  124. vHeader->setCellText(8, 2, "静对动");
  125. t->setVerticalHeader(vHeader);
  126. #endif
  127. */
  128. struct IndexItem
  129. {
  130. QString name;
  131. int row;
  132. int col;
  133. int rowSpan;
  134. int colSpan;
  135. };
  136. void GreyClusteringConfigWidget::refreshTableView()
  137. {
  138. const int nodeDepth = 3; // 节点深度
  139. QTableView *t = ui->grayConfigTableView;
  140. m_model->clear();
  141. // 设置表头
  142. {
  143. auto hHeader = new MultiLevelHeaderView(Qt::Horizontal, 2, nodeDepth + 3 + m_grayNames.size(), t);
  144. hHeader->setSectionResizeMode(QHeaderView::Stretch);
  145. hHeader->setCellSpan(0, 0, 2, nodeDepth); // 指标占位
  146. for (int n = 0; n < 1 + m_grayNames.size(); ++n) { // 单位+灰度级占位
  147. hHeader->setCellSpan(0, nodeDepth + n, 2, 1);
  148. }
  149. hHeader->setCellSpan(0, nodeDepth + 1 + m_grayNames.size(), 1, 2); // 延拓值占位
  150. hHeader->setCellSpan(1, nodeDepth + 1 + m_grayNames.size(), 1, 1);
  151. hHeader->setCellSpan(1, nodeDepth + 1 + m_grayNames.size() + 1, 1, 1);
  152. // 一级
  153. hHeader->setCellText(0, 0, QString("指标"));
  154. hHeader->setCellText(0, nodeDepth, QString("单位"));
  155. for (int i = 0; i < m_grayNames.size(); ++i) {
  156. hHeader->setCellText(0, nodeDepth + 1 + i, m_grayNames.at(i));
  157. }
  158. hHeader->setCellText(0, nodeDepth + 1 + m_grayNames.size(), QString("延拓值"));
  159. // 二级
  160. hHeader->setCellText(1, nodeDepth + 1 + m_grayNames.size(), "左");
  161. hHeader->setCellText(1, nodeDepth + 2 + m_grayNames.size(), "右");
  162. t->setHorizontalHeader(hHeader);
  163. }
  164. QVector<IndexItem> items;
  165. items << IndexItem { "火力", 0, 0, 9, 1 };
  166. items << IndexItem { "火炮口径", 0, 1, 1, 2 };
  167. items << IndexItem { "初速", 1, 1, 3, 1 };
  168. items << IndexItem { "穿甲弹", 1, 2, 1, 1 };
  169. items << IndexItem { "破甲弹", 2, 2, 1, 1 };
  170. items << IndexItem { "榴弹", 3, 2, 1, 1 };
  171. items << IndexItem { "首发命中", 4, 1, 1, 2 };
  172. items << IndexItem { "直射距离", 5, 1, 1, 2 };
  173. items << IndexItem { "弹药基数", 6, 1, 1, 2 };
  174. items << IndexItem { "时间", 7, 1, 2, 1 };
  175. items << IndexItem { "静对静", 7, 2, 1, 1 };
  176. items << IndexItem { "静对动", 8, 2, 1, 1 };
  177. m_model->setColumnCount(nodeDepth + 3 + m_grayNames.size());
  178. m_model->setRowCount(9); // 最大9行
  179. for (auto &item : items) {
  180. auto s = new QStandardItem(item.name);
  181. s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
  182. s->setTextAlignment(Qt::AlignCenter);
  183. s->setToolTip(item.name);
  184. m_model->setItem(item.row, item.col, s);
  185. if (item.rowSpan > 1 || item.colSpan > 1) {
  186. t->setSpan(item.row, item.col, item.rowSpan, item.colSpan);
  187. }
  188. }
  189. for (int r = 0; r < m_model->rowCount(); ++r) {
  190. for (int c = nodeDepth; c < m_model->columnCount(); ++c) {
  191. auto s = new QStandardItem();
  192. s->setTextAlignment(Qt::AlignCenter);
  193. m_model->setItem(r, c, s);
  194. }
  195. }
  196. for (int c = 0; c < m_grayNames.size(); ++c) {
  197. t->setItemDelegateForColumn(c + nodeDepth + 1, new GreyClusteringItemRangeDelegate(t));
  198. }
  199. for (int c = m_grayNames.size(); c < m_grayNames.size() + 2; ++c) {
  200. t->setItemDelegateForColumn(c + nodeDepth + 1, new GreyClusteringItemSpinDelegate(t));
  201. }
  202. }
  203. void GreyClusteringConfigWidget::onConfirmClick()
  204. {
  205. QStringList names;
  206. for (int i = 0; i < m_grayNumber; ++i) {
  207. QLayoutItem *item = ui->grayFormLayout->itemAt(i + 1, QFormLayout::FieldRole);
  208. QLineEdit *le = qobject_cast<QLineEdit *>(item->widget());
  209. if (le) {
  210. if (le->text().trimmed().isEmpty()) {
  211. QMessageBox::warning(this, tr("警告"), tr("级别%1不能为空!").arg(i + 1));
  212. return;
  213. }
  214. names << le->text().trimmed();
  215. }
  216. }
  217. if (names.toSet().size() != m_grayNumber) {
  218. QMessageBox::warning(this, tr("警告"), tr("类别名不能重复!"));
  219. return;
  220. }
  221. m_grayNames = names;
  222. // 更新数据库等级值
  223. QList<GradeInfo *> gradeInfoList;
  224. if (!GradeInfoService().QueryGradeByProjectIdAndType(&gradeInfoList, m_mind->root().projectId, 1)) {
  225. QMessageBox::warning(this, "警告", "数据库访问失败");
  226. return;
  227. }
  228. for (auto gi : gradeInfoList) {
  229. int num = gi->gradeName.mid(3, gi->gradeName.size() - 3).toInt();
  230. if (num < names.size() + 1) {
  231. if (gi->gradeValue != names.at(num - 1)) {
  232. gi->gradeValue = names.at(num - 1);
  233. if (!GradeInfoService().UpdateGradeInfo(*gi)) {
  234. QMessageBox::warning(this, "警告", "数据库访问失败");
  235. return;
  236. }
  237. }
  238. }
  239. }
  240. qDeleteAll(gradeInfoList);
  241. // 刷新表格
  242. refreshTableView();
  243. ui->stackedWidget->setCurrentIndex(1);
  244. }