MatterElementConfigWidget.cpp 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. #include "MatterElementConfigWidget.h"
  2. #include "MatterElementItemDelegate.h"
  3. #include "ui_MatterElementConfigWidget.h"
  4. #include <QLineEdit>
  5. // #include <QDebug>
  6. MatterElementConfigWidget::MatterElementConfigWidget(const QList<MEConfigItem> &configItems, int domainLevel,
  7. QWidget *parent)
  8. : QWidget(parent), ui(new Ui::MatterElementConfigWidget), m_allConfigItems(configItems), m_domainLevel(domainLevel)
  9. {
  10. ui->setupUi(this);
  11. initScaleDivisionTable();
  12. initDomainTable();
  13. }
  14. MatterElementConfigWidget::~MatterElementConfigWidget()
  15. {
  16. delete ui;
  17. }
  18. void MatterElementConfigWidget::initScaleDivisionTable()
  19. {
  20. QTableView *t = ui->scaleDivisionTable;
  21. t->setAlternatingRowColors(false);
  22. t->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  23. t->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  24. t->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  25. t->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
  26. t->setSelectionMode(QAbstractItemView::SingleSelection);
  27. t->verticalHeader()->hide();
  28. m_scaleDivisionmodel = new QStandardItemModel;
  29. t->setModel(m_scaleDivisionmodel);
  30. m_scaleDivisionmodel->setRowCount(1);
  31. m_scaleDivisionmodel->setColumnCount(7);
  32. const QStringList headers = { "定义", "很差", "较差", "一般", "较高", "很高", "相邻定义" };
  33. m_scaleDivisionmodel->setHorizontalHeaderLabels(headers);
  34. QStandardItem *s = nullptr;
  35. MatterElementItemSpinDelegate *sd = new MatterElementItemSpinDelegate(t);
  36. const QStringList originValues = { "1.0", "3.0", "5.0", "7.0", "9.0", "[2.0, 4.0, 6.0, 8.0]" };
  37. for (int i = 0; i < headers.size(); ++i) {
  38. if (i == 0) {
  39. s = new QStandardItem("标度");
  40. s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
  41. s->setTextAlignment(Qt::AlignCenter);
  42. } else {
  43. s = new QStandardItem(originValues.at(i - 1));
  44. s->setTextAlignment(Qt::AlignCenter);
  45. }
  46. m_scaleDivisionmodel->setItem(0, i, s);
  47. if (i > 0 && i < headers.size() - 1) {
  48. t->setItemDelegateForColumn(i, sd);
  49. }
  50. if (i == headers.size() - 1) {
  51. t->setItemDelegateForColumn(i, new MatterElementItemInsideDelegate);
  52. }
  53. }
  54. connect(ui->updateScaleBtn, &QPushButton::clicked, this, &MatterElementConfigWidget::onScaleValueUpdate);
  55. }
  56. static void clearTab(QTabWidget *tabWidget)
  57. {
  58. while (tabWidget->count() > 0) {
  59. auto widget = tabWidget->widget(0); // 获取当前页对应的widget
  60. tabWidget->removeTab(0); // 从QTabWidget中删除当前页
  61. widget->setParent(nullptr); // 从父控件中删除widget对象
  62. widget->deleteLater(); // 删除widget对象
  63. }
  64. }
  65. void MatterElementConfigWidget::initDomainLevelLayout()
  66. {
  67. ui->levelLabel->setText(QString::number(m_domainLevel));
  68. QFormLayout *formLayout = new QFormLayout;
  69. for (int l = 0; l < m_domainLevel; ++l) {
  70. auto le = new QLineEdit(QString("E%1").arg(l + 1));
  71. le->setMinimumHeight(30);
  72. le->setMaximumWidth(80);
  73. m_levelEdits << le;
  74. formLayout->addRow(QString("%1级:").arg(l + 1), le);
  75. }
  76. auto levelSaveBtn = new QPushButton("保存");
  77. levelSaveBtn->setIcon(QIcon(":/qfluentwidgets/images/icons/Save_black.svg"));
  78. levelSaveBtn->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
  79. levelSaveBtn->setMinimumHeight(30);
  80. levelSaveBtn->setMaximumWidth(80);
  81. formLayout->addRow("", levelSaveBtn);
  82. ui->levelWidget->setLayout(formLayout);
  83. connect(levelSaveBtn, &QPushButton::clicked, this, &MatterElementConfigWidget::onLevelSaveBtnClick);
  84. }
  85. void MatterElementConfigWidget::initDomainTable()
  86. {
  87. initDomainLevelLayout();
  88. QStringList parentIndexs;
  89. QHash<QString, QStringList> indexs;
  90. for (const auto &item : m_allConfigItems) {
  91. parentIndexs << item.parentName;
  92. indexs.insert(item.parentName, {});
  93. for (const auto &child : item.childs) {
  94. indexs[item.parentName] << child.name;
  95. }
  96. }
  97. m_meRangeDelegate = new MatterElementItemRangeDelegate(this);
  98. const QStringList rangeItems = { "很差", "较差", "一般", "较高", "很高",
  99. "相邻较差", "相邻一般", "相邻较高", "相邻很高" };
  100. QVector<double> rangeValues;
  101. auto scaleValues = getScaleValues();
  102. rangeValues << scaleValues.at(0) << scaleValues.at(1);
  103. m_meRangeDelegate->setOriginItems(rangeItems, rangeValues);
  104. QStringList domainLevels = getDomainLevels();
  105. for (int pindex = 0; pindex < parentIndexs.size(); ++pindex) {
  106. QTableView *table = new QTableView;
  107. table->setAlternatingRowColors(false);
  108. table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  109. table->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  110. table->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  111. table->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
  112. table->setSelectionMode(QAbstractItemView::SingleSelection);
  113. table->verticalHeader()->hide();
  114. table->verticalHeader()->setDefaultSectionSize(60);
  115. table->horizontalHeader()->hide();
  116. QStandardItemModel *tModel = new QStandardItemModel;
  117. m_domainModels << tModel;
  118. table->setModel(tModel);
  119. int indexNumber = indexs[parentIndexs.at(pindex)].size();
  120. tModel->setColumnCount(4 * domainLevels.size());
  121. tModel->setRowCount(indexNumber);
  122. for (int r = 0; r < domainLevels.size() + 1; ++r) {
  123. QStandardItem *s = nullptr;
  124. if (r < domainLevels.size()) {
  125. s = new QStandardItem(QString("R%1").arg(r + 1));
  126. } else {
  127. s = new QStandardItem("Rp");
  128. }
  129. s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
  130. s->setTextAlignment(Qt::AlignCenter);
  131. if (r < domainLevels.size()) {
  132. s->setToolTip(QString("经典域R%1").arg(r + 1));
  133. } else {
  134. s->setToolTip("节域p");
  135. }
  136. tModel->setItem(0, r * 4, s);
  137. table->setColumnWidth(r * 4, 20);
  138. table->setSpan(0, r * 4, indexNumber, 1);
  139. if (r < domainLevels.size()) {
  140. s = new QStandardItem(domainLevels.at(r));
  141. } else {
  142. s = new QStandardItem("节域p");
  143. }
  144. s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
  145. s->setTextAlignment(Qt::AlignCenter);
  146. tModel->setItem(0, r * 4 + 1, s);
  147. table->setSpan(0, r * 4 + 1, indexNumber, 1);
  148. for (int k = 0; k < indexNumber; ++k) {
  149. s = new QStandardItem(indexs[parentIndexs.at(pindex)].value(k));
  150. s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
  151. s->setTextAlignment(Qt::AlignCenter);
  152. tModel->setItem(k, r * 4 + 2, s);
  153. s = new QStandardItem();
  154. s->setTextAlignment(Qt::AlignCenter);
  155. tModel->setItem(k, r * 4 + 3, s);
  156. }
  157. table->setItemDelegateForColumn(r * 4 + 3, m_meRangeDelegate);
  158. }
  159. ui->tabWidget->addTab(table, parentIndexs.at(pindex));
  160. }
  161. }
  162. QStringList MatterElementConfigWidget::getDomainLevels() const
  163. {
  164. QStringList lvls;
  165. for (int i = 0; i < m_levelEdits.size(); ++i) {
  166. QString v = m_levelEdits.at(i)->text().trimmed();
  167. if (v.isEmpty()) {
  168. lvls << QString("E%1").arg(i + 1);
  169. } else {
  170. lvls << v;
  171. }
  172. }
  173. return lvls;
  174. }
  175. QVector<QVector<double>> MatterElementConfigWidget::getScaleValues() const
  176. {
  177. QVector<QVector<double>> newValues(2);
  178. for (int c = 1; c < m_scaleDivisionmodel->columnCount() - 1; ++c) {
  179. newValues[0] << m_scaleDivisionmodel->item(0, c)->text().toDouble();
  180. }
  181. QString value = m_scaleDivisionmodel->item(0, m_scaleDivisionmodel->columnCount() - 1)->text();
  182. QStringList tmp = value.mid(1, value.size() - 2).replace(" ", "").split(",");
  183. for (const auto &var : tmp) {
  184. newValues[1] << var.toDouble();
  185. }
  186. return newValues;
  187. }
  188. void MatterElementConfigWidget::onLevelSaveBtnClick()
  189. {
  190. QStringList domainLevels = getDomainLevels();
  191. for (auto model : m_domainModels) {
  192. for (int c = 0; c < domainLevels.size(); ++c) {
  193. model->item(0, c * 4 + 1)->setText(domainLevels.at(c));
  194. }
  195. }
  196. }
  197. void MatterElementConfigWidget::onScaleValueUpdate()
  198. {
  199. ui->scaleDivisionTable->clearSelection();
  200. QVector<double> rangeValues;
  201. auto scaleValues = getScaleValues();
  202. rangeValues << scaleValues.at(0) << scaleValues.at(1);
  203. m_meRangeDelegate->updateOriginValues(rangeValues);
  204. }
  205. QList<MEConfigItem> MatterElementConfigWidget::getAllConfigItems() const
  206. {
  207. return m_allConfigItems;
  208. }