ShowTempPage.cpp 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. #include "ShowTempPage.h"
  2. #include "ui_ShowTempPage.h"
  3. #include <QTimer>
  4. #include <set>
  5. #include "ShowTemperatureWnd.h"
  6. #include "ShowTemperatureListNumberWnd.h"
  7. ShowTempPage::ShowTempPage(QWidget *parent)
  8. : QWidget(parent)
  9. , ui(new Ui::ShowTempPage)
  10. {
  11. ui->setupUi(this);
  12. ui->praTabWidget->tabBar()->hide();
  13. QTimer::singleShot(800, this, [&]() { Init(); });
  14. UpDataParameter();
  15. }
  16. ShowTempPage::~ShowTempPage()
  17. {
  18. delete ui;
  19. }
  20. void ShowTempPage::Init()
  21. {
  22. m_manageDB = ns_db::CManageDB::GetInstance();
  23. if (m_manageDB == nullptr)
  24. {
  25. return;
  26. }
  27. m_pProduct = m_manageDB->GetCProduct();
  28. if (m_pProduct == nullptr)
  29. {
  30. return;
  31. }
  32. setStyleSheet(
  33. "QWidget { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #F1F4FD, stop: 1 #E5E4F6); }"
  34. "QLineEdit::disabled { background: #D8D8E3; border: 1px solid #BABBDC; border-radius: 6px; padding: 2px 5px; }"
  35. "QLineEdit { background: #FFFFFF; border: 1px solid #BABBDC; border-radius: 6px; padding: 2px 5px; }"
  36. "QPushButton { background: #D0D0E8; border: 1px solid #BABBDC; border-radius: 6px; padding: 2px 5px; }" // Button background color
  37. "QPushButton:hover { background-color: #B0B0D8; }" // Lighter color on hover
  38. "QPushButton:pressed { background-color: #A0A0C8; }" // Darker color on press
  39. );
  40. InitSerialNumberList();
  41. }
  42. std::vector<ns_db::TEMPERATURE_LIST_STRUCT> ShowTempPage::FilterTemperatures(
  43. const std::vector<ns_db::TEMPERATURE_LIST_STRUCT>& originalList)
  44. {
  45. std::vector<ns_db::TEMPERATURE_LIST_STRUCT> filteredList;
  46. // 使用 std::map 来存储每个 iId 对应的所有 TEMPERATURE_LIST_STRUCT
  47. // map<iId, vector<TEMPERATURE_LIST_STRUCT>>
  48. std::map<int, std::vector<ns_db::TEMPERATURE_LIST_STRUCT>> groupedById;
  49. // 第一次遍历:按 iId 分组
  50. for (const auto& item : originalList)
  51. {
  52. groupedById[item.iId].push_back(item);
  53. }
  54. // 遍历每个 iId 组
  55. for (const auto& pair : groupedById)
  56. {
  57. const int currentId = pair.first;
  58. const std::vector<ns_db::TEMPERATURE_LIST_STRUCT>& currentGroup = pair.second;
  59. // 检查该 iId 组中是否有多个不同的 iSerialNumber
  60. std::set<int> serialNumbersInGroup;
  61. for (const auto& item : currentGroup) {
  62. serialNumbersInGroup.insert(item.iSerialNumber);
  63. }
  64. // 如果这个 iId 组包含多于一个不同的 iSerialNumber,则将该组的所有元素添加到结果中
  65. if (serialNumbersInGroup.size() > 1) {
  66. for (const auto& item : currentGroup) {
  67. filteredList.push_back(item);
  68. }
  69. }
  70. }
  71. return filteredList;
  72. }
  73. void ShowTempPage::UpdataUi(int nIndex, int ncurrentGroupIndex, bool isClear/* = false*/)
  74. {
  75. //if (isClear)
  76. {
  77. ui->serialNumberList->clear();
  78. }
  79. // 释放
  80. int nI = 0;
  81. // 筛选出来了
  82. for (const auto& pair : m_groupedById)
  83. {
  84. if (nI == nIndex)
  85. {
  86. const int currentId = pair.first;
  87. const std::vector<ns_db::TEMPERATURE_LIST_STRUCT>& currentGroup = pair.second;
  88. for (int i = 0; i < currentGroup.size(); i++)
  89. {
  90. AddListItem<ShowTemperatureListNumberWnd>(currentGroup[i], i, ui->serialNumberList, QSize(370, 48));
  91. }
  92. UpDataParameter(false, currentGroup[ncurrentGroupIndex]);
  93. break; //只要一个
  94. }
  95. nI++;
  96. }
  97. }
  98. void ShowTempPage::AddOrDel(int iId, int iSerialNumber, bool isDel)
  99. {
  100. // 释放
  101. ui->serialNumberList->clear();
  102. int nI = 0;
  103. // 筛选出来了
  104. for (auto& pair : m_groupedById)
  105. {
  106. if (nI == iId)
  107. {
  108. std::vector<ns_db::TEMPERATURE_LIST_STRUCT>& currentGroup = pair.second;
  109. if (isDel)
  110. {
  111. for (int i = 0; i < currentGroup.size(); i++)
  112. {
  113. if (currentGroup[i].iSerialNumber == iSerialNumber)
  114. {
  115. currentGroup.erase(currentGroup.begin() + i);
  116. /*if (m_pProduct)
  117. {
  118. m_pProduct->DeleteTemperatureList(currentGroup[i].iId,
  119. currentGroup[i].iSerialNumber);
  120. }*/
  121. break;
  122. }
  123. }
  124. }
  125. else
  126. {
  127. int nSize = currentGroup.size();
  128. ns_db::TEMPERATURE_LIST_STRUCT _list = {};
  129. if (nSize > 0)
  130. {
  131. //最大减一
  132. _list = currentGroup[nSize - 1];
  133. }
  134. else
  135. {
  136. _list.iId = ui->idListComboBox->currentText().toInt();
  137. }
  138. _list.iSerialNumber += 1;
  139. currentGroup.push_back(_list);
  140. /* if (m_pProduct)
  141. {
  142. m_pProduct->AddTemperatureList(_list);
  143. }*/
  144. }
  145. for (int i = 0; i < currentGroup.size(); i++)
  146. {
  147. AddListItem<ShowTemperatureListNumberWnd>(currentGroup[i], i, ui->serialNumberList, QSize(370, 48));
  148. }
  149. UpDataParameter(true);
  150. break; //只要一个
  151. }
  152. nI++;
  153. }
  154. }
  155. void ShowTempPage::InitSerialNumberList()
  156. {
  157. std::vector <ns_db::TEMPERATURE_LIST_STRUCT> vecCurrentTemperatureList = m_pProduct->GetAllTemperatureList();
  158. int n = 0;
  159. // 模拟数据
  160. //if (vecCurrentTemperatureList.size() == 0)
  161. {
  162. for (int i = 0; i < 111; i++)
  163. {
  164. ns_db::TEMPERATURE_LIST_STRUCT _a = {};
  165. if (n < 6)
  166. {
  167. _a.iId = i + 1;
  168. }
  169. else
  170. {
  171. n = 0;
  172. }
  173. n++;
  174. _a.iSerialNumber = i + 1;
  175. vecCurrentTemperatureList.push_back(_a);
  176. }
  177. }
  178. // 第一次遍历:按 iId 分组
  179. for (const auto& item : vecCurrentTemperatureList)
  180. {
  181. m_groupedById[item.iId].push_back(item);
  182. }
  183. UpdataUi(0,0);
  184. for (int i = 0; i < m_groupedById.size(); i++)
  185. {
  186. ui->idListComboBox->addItem(QString::number(i));
  187. }
  188. }
  189. void ShowTempPage::UpDataParameter(bool isDel /*= false*/, const ns_db::TEMPERATURE_LIST_STRUCT temperaturePar /*= {}*/)
  190. {
  191. if (isDel)
  192. {
  193. ui->praTabWidget->removeTab(0);
  194. m_ShowTemperatureWnd->deleteLater();
  195. m_ShowTemperatureWnd = nullptr;
  196. }
  197. else
  198. {
  199. if (m_ShowTemperatureWnd)
  200. {
  201. UpDataParameter(true);
  202. }
  203. m_ShowTemperatureWnd = new ShowTemperatureWnd();
  204. m_ShowTemperatureWnd->SetTemperaturePar(temperaturePar);
  205. connect(m_ShowTemperatureWnd, &ShowTemperatureWnd::SendModifyTemperatureListSingals,
  206. this, &ShowTempPage::GetModifyTemperatureListSlots);
  207. ui->praTabWidget->addTab(m_ShowTemperatureWnd, "Parameter Page");
  208. }
  209. }
  210. template <typename Y>
  211. void ShowTempPage::AddListItem(const ns_db::TEMPERATURE_LIST_STRUCT& temperaturePar,
  212. int nIndex,QListWidget* listWidget,const QSize& sizeHint)
  213. {
  214. Y* pWnd = new Y(this);
  215. pWnd->setAttribute(Qt::WA_DeleteOnClose);
  216. connect(pWnd, &Y::SendDelTemperatureListSingals, this, &ShowTempPage::GetDelTemperatureListSlots);
  217. //connect(pWnd, &Y::SendAddTemperatureListSingals, this, &ShowTempPage::GetAddTemperatureListSlots);
  218. //connect(pWnd, &Y::SendModifyTemperatureListSingals, this, &ShowTempPage::GetModifyTemperatureListSlots);
  219. pWnd->SetTemperaturePar(temperaturePar, nIndex);
  220. QListWidgetItem* item = new QListWidgetItem();
  221. item->setSizeHint(sizeHint);
  222. listWidget->addItem(item);
  223. listWidget->setItemWidget(item, pWnd);
  224. }
  225. void ShowTempPage::on_idListComboBox_currentIndexChanged(int index)
  226. {
  227. UpdataUi(index, 0);
  228. }
  229. void ShowTempPage::on_serialNumberList_itemSelectionChanged()
  230. {
  231. QListWidgetItem* selectedItem = ui->serialNumberList->currentItem();
  232. if (selectedItem)
  233. {
  234. int row = ui->serialNumberList->row(selectedItem);
  235. UpdataUi(ui->idListComboBox->currentText().toInt(), row);
  236. }
  237. }
  238. void ShowTempPage::on_addBut_clicked()
  239. {
  240. AddOrDel(ui->idListComboBox->currentText().toInt(), -1, false);
  241. }
  242. void ShowTempPage::on_saveAllBut_clicked()
  243. {
  244. //保存所有
  245. /*if (m_pProduct)
  246. {
  247. m_pProduct->TemperatureListSaveToDB();
  248. }*/
  249. }
  250. void ShowTempPage::GetDelTemperatureListSlots(int iId, int iSerialNumber)
  251. {
  252. AddOrDel(iId, iSerialNumber, true);
  253. }
  254. void ShowTempPage::GetModifyTemperatureListSlots(const ns_db::TEMPERATURE_LIST_STRUCT& temperaturePar)
  255. {
  256. int nI = 0;
  257. for (auto& pair : m_groupedById)
  258. {
  259. if (nI == temperaturePar.iId)
  260. {
  261. std::vector<ns_db::TEMPERATURE_LIST_STRUCT>& currentGroup = pair.second;
  262. for (int i = 0; i < currentGroup.size(); i++)
  263. {
  264. if (currentGroup[i].iSerialNumber == temperaturePar.iSerialNumber)
  265. {
  266. // 直接全部替换
  267. currentGroup[i] = temperaturePar;
  268. /* if (m_pProduct)
  269. {
  270. m_pProduct->ModifyTemperatureList(temperaturePar);
  271. }*/
  272. break;
  273. }
  274. }
  275. break; //只要一个
  276. }
  277. nI++;
  278. }
  279. }