GreyClusteringSampleTable.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. #include "GreyClusteringItemDelegate.h"
  2. #include "GreyClusteringSampleTable.h"
  3. #include "MultiLevelHeaderView.h"
  4. #include <QHeaderView>
  5. #include <QDebug>
  6. /**
  7. * example
  8. * QVector<GreyClusteringItem> gcItems;
  9. gcItems << GreyClusteringItem { "火力", 0, 0, 9, 1, nullptr };
  10. QSharedPointer<GreyClusteringValue> sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
  11. sg->units = "m";
  12. sg->weiget = 2;
  13. sg->greyRanges << GreyRange { "较差类", true, 85, true, 100 };
  14. sg->greyRanges << GreyRange { "一般类", true, 100, true, 115 };
  15. sg->greyRanges << GreyRange { "较好类", true, 115, true, 125 };
  16. sg->leftExtension = 70;
  17. sg->rightExtension = 140;
  18. sg->oldValue = 0;
  19. sg->newValue = 0;
  20. gcItems << GreyClusteringItem { "火炮口径", 0, 1, 1, 2, sg };
  21. gcItems << GreyClusteringItem { "初速", 1, 1, 3, 1, nullptr };
  22. sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
  23. sg->units = "m";
  24. sg->weiget = 4;
  25. sg->greyRanges << GreyRange { "较差类", true, 1600, true, 1300 };
  26. sg->greyRanges << GreyRange { "一般类", true, 1600, true, 1900 };
  27. sg->greyRanges << GreyRange { "较好类", true, 1600, true, 1900 };
  28. sg->leftExtension = 500;
  29. sg->rightExtension = 220;
  30. sg->oldValue = 0;
  31. sg->newValue = 0;
  32. gcItems << GreyClusteringItem { "穿甲弹", 1, 2, 1, 1, sg };
  33. sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
  34. sg->units = "m";
  35. sg->weiget = 4;
  36. sg->greyRanges << GreyRange { "较差类", true, 1000, true, 1200 };
  37. sg->greyRanges << GreyRange { "一般类", true, 1200, true, 1400 };
  38. sg->greyRanges << GreyRange { "较好类", true, 1200, true, 1400 };
  39. sg->leftExtension = 600;
  40. sg->rightExtension = 1700;
  41. sg->oldValue = 0;
  42. sg->newValue = 0;
  43. gcItems << GreyClusteringItem { "破甲弹", 2, 2, 1, 1, sg };
  44. sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
  45. sg->units = "m";
  46. sg->weiget = 4;
  47. sg->greyRanges << GreyRange { "较差类", true, 500, false, 650 };
  48. sg->greyRanges << GreyRange { "一般类", true, 650, false, 800 };
  49. sg->greyRanges << GreyRange { "较好类", true, 800, false, 1000 };
  50. sg->leftExtension = 400;
  51. sg->rightExtension = 1100;
  52. sg->oldValue = 0;
  53. sg->newValue = 0;
  54. gcItems << GreyClusteringItem { "榴弹", 3, 2, 1, 1, sg };
  55. sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
  56. sg->units = "";
  57. sg->weiget = 5;
  58. sg->greyRanges << GreyRange { "较差类", true, 0.5, false, 0.65 };
  59. sg->greyRanges << GreyRange { "一般类", true, 0.65, false, 0.75 };
  60. sg->greyRanges << GreyRange { "较好类", true, 0.75, false, 0.9 };
  61. sg->leftExtension = 0.45;
  62. sg->rightExtension = 0.95;
  63. sg->oldValue = 0;
  64. sg->newValue = 0;
  65. gcItems << GreyClusteringItem { "首发命中", 4, 1, 1, 2, sg };
  66. sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
  67. sg->units = "m";
  68. sg->weiget = 5;
  69. sg->greyRanges << GreyRange { "较差类", true, 800, false, 1200 };
  70. sg->greyRanges << GreyRange { "一般类", true, 1200, false, 1600 };
  71. sg->greyRanges << GreyRange { "较好类", true, 1600, false, 2200 };
  72. sg->leftExtension = 500;
  73. sg->rightExtension = 2500;
  74. sg->oldValue = 0;
  75. sg->newValue = 0;
  76. gcItems << GreyClusteringItem { "直射距离", 5, 1, 1, 2, sg };
  77. sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
  78. sg->units = "发";
  79. sg->weiget = 3;
  80. sg->greyRanges << GreyRange { "较差类", true, 30, false, 40 };
  81. sg->greyRanges << GreyRange { "一般类", true, 40, false, 50 };
  82. sg->greyRanges << GreyRange { "较好类", true, 50, false, 65 };
  83. sg->leftExtension = 28;
  84. sg->rightExtension = 70;
  85. sg->oldValue = 0;
  86. sg->newValue = 0;
  87. gcItems << GreyClusteringItem { "弹药基数", 6, 1, 1, 2, sg };
  88. gcItems << GreyClusteringItem { "时间", 7, 1, 2, 1, nullptr };
  89. sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
  90. sg->units = "s";
  91. sg->weiget = 3;
  92. sg->greyRanges << GreyRange { "较差类", true, 11, false, 10 };
  93. sg->greyRanges << GreyRange { "一般类", true, 10, false, 7 };
  94. sg->greyRanges << GreyRange { "较好类", true, 7, false, 4 };
  95. sg->leftExtension = 12;
  96. sg->rightExtension = 3;
  97. sg->oldValue = 0;
  98. sg->newValue = 0;
  99. gcItems << GreyClusteringItem { "静对静", 7, 2, 1, 1, sg };
  100. sg = QSharedPointer<GreyClusteringValue>(new GreyClusteringValue);
  101. sg->units = "s";
  102. sg->weiget = 3;
  103. sg->greyRanges << GreyRange { "较差类", true, 14, false, 12 };
  104. sg->greyRanges << GreyRange { "一般类", true, 12, false, 10 };
  105. sg->greyRanges << GreyRange { "较好类", true, 10, false, 7 };
  106. sg->leftExtension = 15;
  107. sg->rightExtension = 5;
  108. sg->oldValue = 0;
  109. sg->newValue = 0;
  110. gcItems << GreyClusteringItem { "静对动", 8, 2, 1, 1, sg };
  111. GreyClusteringSampleTable gcst(gcItems, 3, 9);
  112. gcst.resize(1200, 800);
  113. gcst.refreshTableView();
  114. gcst.show();
  115. */
  116. GreyClusteringSampleTable::GreyClusteringSampleTable(const QVector<GreyClusteringItem> &gcItems, int nodeDepth,
  117. int rowNodes, QWidget *parent)
  118. : QTableView(parent), m_greyClusterings(gcItems), m_nodeDepth(nodeDepth), m_rowNodes(rowNodes)
  119. {
  120. m_model = new QStandardItemModel();
  121. this->setModel(m_model);
  122. init();
  123. }
  124. void GreyClusteringSampleTable::refreshTableView()
  125. {
  126. m_model->clear();
  127. if (m_greyClusterings.size() == 0) {
  128. return;
  129. }
  130. QStringList greyNames; // 灰数
  131. for (auto &item : m_greyClusterings) {
  132. if (!item.value.isNull()) {
  133. for (const auto &s : item.value->greyRanges) {
  134. greyNames << s.name;
  135. }
  136. break;
  137. }
  138. }
  139. int colCount = m_nodeDepth + 6 + greyNames.size();
  140. // 设置表头
  141. {
  142. auto hHeader = new MultiLevelHeaderView(Qt::Horizontal, 2, colCount, this);
  143. hHeader->setSectionResizeMode(QHeaderView::Stretch);
  144. hHeader->setCellSpan(0, 0, 2, m_nodeDepth); // 指标占位
  145. for (int n = 0; n < 2 + greyNames.size(); ++n) { // 单位+权重+灰度级占位
  146. hHeader->setCellSpan(0, m_nodeDepth + n, 2, 1);
  147. }
  148. hHeader->setCellSpan(0, m_nodeDepth + 2 + greyNames.size(), 1, 2); // 延拓值占位
  149. hHeader->setCellSpan(1, m_nodeDepth + 2 + greyNames.size(), 1, 1);
  150. hHeader->setCellSpan(1, m_nodeDepth + 2 + greyNames.size() + 1, 1, 1);
  151. hHeader->setCellSpan(0, m_nodeDepth + 4 + greyNames.size(), 1, 2); // 实现值占位
  152. hHeader->setCellSpan(1, m_nodeDepth + 4 + greyNames.size(), 1, 1);
  153. hHeader->setCellSpan(1, m_nodeDepth + 4 + greyNames.size() + 1, 1, 1);
  154. // 一级
  155. hHeader->setCellText(0, 0, QString("指标"));
  156. hHeader->setCellText(0, m_nodeDepth, QString("单位"));
  157. hHeader->setCellText(0, m_nodeDepth + 1, QString("权重"));
  158. for (int i = 0; i < greyNames.size(); ++i) {
  159. hHeader->setCellText(0, m_nodeDepth + 2 + i, greyNames.at(i));
  160. }
  161. hHeader->setCellText(0, m_nodeDepth + 2 + greyNames.size(), QString("延拓值"));
  162. hHeader->setCellText(0, m_nodeDepth + 4 + greyNames.size(), QString("实现值"));
  163. // 二级
  164. hHeader->setCellText(1, m_nodeDepth + 2 + greyNames.size(), "左");
  165. hHeader->setCellText(1, m_nodeDepth + 3 + greyNames.size(), "右");
  166. hHeader->setCellText(1, m_nodeDepth + 4 + greyNames.size(), "改前");
  167. hHeader->setCellText(1, m_nodeDepth + 5 + greyNames.size(), "改后");
  168. this->setHorizontalHeader(hHeader);
  169. }
  170. m_model->setColumnCount(colCount);
  171. m_model->setRowCount(m_rowNodes);
  172. for (const auto &item : m_greyClusterings) {
  173. // 第一步,设置指标名
  174. auto s = new QStandardItem(item.indexName);
  175. s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
  176. s->setTextAlignment(Qt::AlignCenter);
  177. s->setToolTip(item.indexName);
  178. m_model->setItem(item.row, item.col, s);
  179. if (item.rowSpan > 1 || item.colSpan > 1) {
  180. this->setSpan(item.row, item.col, item.rowSpan, item.colSpan);
  181. }
  182. // 第二步,查看当前指标下是否附带值
  183. if (!item.value.isNull()) {
  184. int offset = item.colSpan;
  185. m_model->setItem(item.row, item.col + offset, new QStandardItem(item.value->units)); // 单位
  186. ++offset;
  187. m_model->setItem(item.row, item.col + offset,
  188. new QStandardItem(QString::number(item.value->weiget))); // 权重
  189. ++offset;
  190. for (auto &range : item.value->greyRanges) { // 灰度级
  191. QString r;
  192. r += range.leftClose ? "[" : "(";
  193. r += QString("%1, %2").arg(range.leftValue).arg(range.rightValue);
  194. r += range.rightClose ? "]" : ")";
  195. m_model->setItem(item.row, item.col + offset, new QStandardItem(r));
  196. ++offset;
  197. }
  198. m_model->setItem(item.row, item.col + offset,
  199. new QStandardItem(QString::number(item.value->leftExtension))); // 延拓值左
  200. ++offset;
  201. m_model->setItem(item.row, item.col + offset,
  202. new QStandardItem(QString::number(item.value->rightExtension))); // 延拓值右
  203. ++offset;
  204. m_model->setItem(item.row, item.col + offset,
  205. new QStandardItem(QString::number(item.value->oldValue))); // 实现值前
  206. ++offset;
  207. m_model->setItem(item.row, item.col + offset,
  208. new QStandardItem(QString::number(item.value->newValue))); // 实现值后
  209. ++offset;
  210. for (int c = item.colSpan; c < offset - 2; ++c) {
  211. m_model->item(item.row, item.col + c)->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
  212. m_model->item(item.row, item.col + c)->setTextAlignment(Qt::AlignCenter);
  213. }
  214. for (int c = offset - 2; c < offset; ++c) {
  215. m_model->item(item.row, item.col + c)->setTextAlignment(Qt::AlignCenter);
  216. this->setItemDelegateForColumn(item.col + c, new GreyClusteringItemSpinDelegate(this));
  217. }
  218. }
  219. }
  220. }
  221. void GreyClusteringSampleTable::init()
  222. {
  223. setAlternatingRowColors(false);
  224. horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  225. horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  226. verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  227. verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
  228. setSelectionMode(QAbstractItemView::SingleSelection);
  229. }