MatterElementConfigWidget.cpp 9.6 KB

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