EvalSchemeWidget.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. #include "EvalSchemeWidget.h"
  2. #include <CCanvas/CSchemeView.h>
  3. #include <CCanvas/CSchemeItem.h>
  4. #include <Widgets/Button.h>
  5. #include <Widgets/Menu.h>
  6. #include <Widgets/CheckBox.h>
  7. #include <QLabel>
  8. #include <QLayout>
  9. #include <QMetaEnum>
  10. #include <QDebug>
  11. QString EvalSchemeWidget::nameOfScheme(Scheme s)
  12. {
  13. switch (s) {
  14. case Index:
  15. return "构建指标体系";
  16. case Collect:
  17. return "收集数据";
  18. case Process:
  19. return "处理数据";
  20. case Output:
  21. return "生成报告";
  22. }
  23. }
  24. QString EvalSchemeWidget::nameOfAlgorithm(EvalSchemeWidget::Algorithm a)
  25. {
  26. switch (a) {
  27. case Alg1:
  28. return "层次分析法";
  29. case Alg2:
  30. return "集对分析法";
  31. case Alg3:
  32. return "熵值法";
  33. case Alg4:
  34. return "物元分析法";
  35. case Alg5:
  36. return "灰色聚类评估法";
  37. }
  38. }
  39. EvalSchemeWidget::EvalSchemeWidget(ProjectInfo *proj, int type, QWidget *parent) : EvalWidget(proj, type, parent)
  40. {
  41. setTitle("评估方案规划");
  42. initWidgets();
  43. initLayout();
  44. connectSignalsAndSlots();
  45. testData();
  46. }
  47. void EvalSchemeWidget::initWidgets()
  48. {
  49. m_schemeBtn = new PushButton("加载方案", this);
  50. m_index = new CheckBox("指标体系", this);
  51. m_data = new CheckBox("收集数据", this);
  52. m_algBtn = new PushButton("数据处理", this);
  53. m_clear = new PushButton("清空");
  54. // 按照方案枚举值添加按钮
  55. // QMetaEnum sch = QMetaEnum::fromType<Scheme>();
  56. // for (int i = 0; i < sch.keyCount(); i++) {
  57. // Scheme s = Scheme(sch.value(i));
  58. // PushButton *btn = new PushButton(nameOfScheme(s), this);
  59. // btn->setMinimumWidth(80);
  60. // m_buttonLayout->addWidget(btn);
  61. // connect(btn, &PushButton::clicked, [this, s, btn]() { slotSelectScheme(s, btn); });
  62. // }
  63. // m_buttonLayout->setSpacing(15);
  64. // m_buttonLayout->addStretch();
  65. m_schemeView = new CSchemeView(this);
  66. m_schemeSep = new QWidget(this);
  67. m_schemeSep->setFixedWidth(1);
  68. m_description = new QLabel("description", this);
  69. m_description->setFixedWidth(150);
  70. QMap<QString, SchemeAndAlg> schemes;
  71. schemes["指标体系"] = { Index | Process | Output, Alg1 };
  72. schemes["收集数据"] = { Collect | Process | Output, Alg1 };
  73. schemes["指标体系和收集数据"] = { Index | Collect | Process | Output, Alg1 };
  74. m_schemeMenu = new RoundMenu("scheme", this);
  75. m_schemeMenu->addAction(new QAction("方案一"));
  76. m_schemeMenu->addAction(new QAction("方案二"));
  77. m_schemeMenu->addAction(new QAction("方案三"));
  78. // 按照算法枚举值添加算法选项
  79. m_algMenu = new RoundMenu("alg", this);
  80. QMetaEnum alg = QMetaEnum::fromType<Algorithm>();
  81. for (int i = 0; i < alg.keyCount(); i++) {
  82. Algorithm t = Algorithm(alg.value(i));
  83. QAction *act = new QAction(nameOfAlgorithm(t));
  84. m_algMenu->addAction(act);
  85. connect(act, &QAction::triggered, [this, t]() { slotSelectAlgorithm(t); });
  86. }
  87. }
  88. void EvalSchemeWidget::initLayout()
  89. {
  90. // 总体布局
  91. m_buttonLayout = new QHBoxLayout();
  92. m_contentLayout->addLayout(m_buttonLayout);
  93. m_schemeLayout = new QHBoxLayout();
  94. m_contentLayout->addLayout(m_schemeLayout);
  95. m_buttonLayout->addWidget(m_schemeBtn);
  96. m_buttonLayout->addSpacing(20);
  97. m_buttonLayout->addWidget(m_index);
  98. m_buttonLayout->addSpacing(20);
  99. m_buttonLayout->addWidget(m_data);
  100. m_buttonLayout->addSpacing(20);
  101. m_buttonLayout->addWidget(m_algBtn);
  102. m_buttonLayout->addSpacing(20);
  103. m_buttonLayout->addWidget(m_clear);
  104. m_buttonLayout->addStretch();
  105. m_schemeLayout->addWidget(m_schemeView);
  106. m_schemeLayout->addWidget(m_seperator);
  107. m_schemeLayout->addWidget(m_description);
  108. }
  109. void EvalSchemeWidget::connectSignalsAndSlots()
  110. {
  111. connect(m_schemeBtn, &PushButton::clicked, this, &EvalSchemeWidget::slotShowSchemeMenu);
  112. connect(m_index, &CheckBox::clicked, this, &EvalSchemeWidget::slotIndexClicked);
  113. connect(m_data, &CheckBox::clicked, this, &EvalSchemeWidget::slotDataClicked);
  114. connect(m_algBtn, &PushButton::clicked, this, &EvalSchemeWidget::slotAlgBtnClicked);
  115. connect(m_clear, &PushButton::clicked, this, &EvalSchemeWidget::slotClearClicked);
  116. }
  117. void EvalSchemeWidget::refreshSchemeView()
  118. {
  119. qDebug() << __FUNCTION__ << __LINE__ << m_scheme << endl;
  120. m_schemeView->clear();
  121. if (m_scheme > 0) {
  122. m_scheme |= Output;
  123. }
  124. QMetaEnum sch = QMetaEnum::fromType<Scheme>();
  125. for (int i = 0; i < sch.keyCount(); i++) {
  126. Scheme s = Scheme(sch.value(i));
  127. if (s == Process) {
  128. for (Algorithm a : m_algs) {
  129. CSchemeItem *item = new CSchemeItem(nameOfAlgorithm(a));
  130. m_schemeView->addItem(item);
  131. }
  132. } else {
  133. if ((m_scheme & s) == s) {
  134. CSchemeItem *item = new CSchemeItem(nameOfScheme(s));
  135. m_schemeView->addItem(item);
  136. }
  137. }
  138. }
  139. }
  140. void EvalSchemeWidget::testData()
  141. {
  142. m_scheme = Index | Collect | Output;
  143. m_algs = { Alg1 };
  144. refreshSchemeView();
  145. }
  146. void EvalSchemeWidget::slotShowSchemeMenu()
  147. {
  148. QPoint pos = m_schemeBtn->mapToGlobal(QPoint()) + QPoint(m_schemeBtn->width(), -10);
  149. m_schemeMenu->exec(pos, true);
  150. }
  151. void EvalSchemeWidget::slotIndexClicked()
  152. {
  153. m_scheme ^= Index;
  154. refreshSchemeView();
  155. }
  156. void EvalSchemeWidget::slotDataClicked()
  157. {
  158. m_scheme ^= Collect;
  159. refreshSchemeView();
  160. }
  161. void EvalSchemeWidget::slotAlgBtnClicked()
  162. {
  163. QPoint pos = m_algBtn->mapToGlobal(QPoint()) + QPoint(m_algBtn->width(), -10);
  164. m_algMenu->exec(pos, true);
  165. }
  166. void EvalSchemeWidget::slotClearClicked()
  167. {
  168. m_scheme = 0;
  169. m_algs.clear();
  170. refreshSchemeView();
  171. }
  172. void EvalSchemeWidget::slotSelectAlgorithm(EvalSchemeWidget::Algorithm alg)
  173. {
  174. if (m_algs.contains(alg)) {
  175. return;
  176. }
  177. m_algs.clear();
  178. m_algs.append(alg);
  179. refreshSchemeView();
  180. }