compareitemlistdialog.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. #include "compareitemlistdialog.h"
  2. #include "ui_compareitemlistwidget.h"
  3. #include <QWidget>
  4. #include "compareitemdialog.h"
  5. #include "UIStyleManager.h"
  6. #include "CompareItemData.h"
  7. #include "GlobalInfo.h"
  8. #include "tipwidget.h"
  9. #include "warning.h"
  10. #include "compareitemdetailwidget.h"
  11. #include "baseheader.h"
  12. /* 重载比较函数 */
  13. bool CSortModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
  14. {
  15. // /* 先比较是正常日还是特殊日 */
  16. // auto leftDay = sourceModel()->data(left, UserRole_WeekDay).toInt();
  17. // auto rightDay = sourceModel()->data(right, UserRole_WeekDay).toInt();
  18. // if(leftDay != rightDay)
  19. // {
  20. // return leftDay < rightDay; /* 比较周几 */
  21. // }
  22. // /* 日期类型相等,再比较时间 */
  23. // auto leftTime = sourceModel()->data(left, UserRole_Time).toDateTime();
  24. // auto rightTime = sourceModel()->data(right, UserRole_Time).toDateTime();
  25. // if(leftDay == static_cast<int>(enum_WeekDay::WeekDay_Special))
  26. // {
  27. // /* 特殊日,比较日期和时间 */
  28. // return leftTime < rightTime;
  29. // }else {
  30. // /* 正常日,只比较时间 */
  31. // return leftTime.time() < rightTime.time();
  32. // }
  33. return true;
  34. }
  35. CompareItemListDialog::CompareItemListDialog(QWidget *parent) :
  36. DialogBase(parent),
  37. ui(new Ui::CompareItemListWidget)
  38. {
  39. QWidget *widgetContent = new QWidget(this);
  40. ui->setupUi(widgetContent);
  41. /* 设置内容 */
  42. setContentWidget(widgetContent);
  43. /* 移除底栏 */
  44. removeBottomWidget();
  45. /* 设置标题 */
  46. setTitle("对比项列表", QSize(120, 18));
  47. UIStyle.registerWidget(widgetContent);
  48. // SPDLOG_LOGGER_DEBUG(m_logger, "ObjectName: {}", widgetContent->objectName().toStdString());
  49. this->resize(1000 + 40, 800 + 40); /* 设置对话框大小,包含阴影的宽度 */
  50. /* 连接信号和槽 */
  51. connect(ui->pBtn_close, &QPushButton::clicked, this, &CompareItemListDialog::do_pBtn_close_Clicked);
  52. connect(ui->pBtn_add, &QPushButton::clicked, this, &CompareItemListDialog::do_pBtn_add_Clicked);
  53. connect(ui->pBtn_delete, &QPushButton::clicked, this, &CompareItemListDialog::do_pBtn_delete_Clicked);
  54. connect(ui->pBtn_modify, &QPushButton::clicked, this, &CompareItemListDialog::do_pBtn_edit_Clicked);
  55. connect(ui->pBtn_enableCPItem, &QPushButton::clicked, this, &CompareItemListDialog::do_pBtn_enable_Clicked);
  56. connect(ui->pBtn_disableCPItem, &QPushButton::clicked, this, &CompareItemListDialog::do_pBtn_disable_Clicked);
  57. connect(ui->tableView, &QTableView::doubleClicked, this, &CompareItemListDialog::do_tableView_doubleClicked);
  58. /* 初始化表格 */
  59. initTable();
  60. }
  61. CompareItemListDialog::~CompareItemListDialog()
  62. {
  63. UIStyle.unregisterWidget(getContentWidget());
  64. delete ui;
  65. }
  66. /* 设置已有的对比项数据 */
  67. void CompareItemListDialog::setCompareItemList(const QList<CompareItemTableItem_t>& list)
  68. {
  69. for(const CompareItemTableItem_t& item : list)
  70. {
  71. /* 添加到表格中 */
  72. addRow(item);
  73. }
  74. }
  75. /* 点击了关闭按钮 */
  76. void CompareItemListDialog::do_pBtn_close_Clicked()
  77. {
  78. this->close();
  79. }
  80. /* 点击了添加按钮 */
  81. void CompareItemListDialog::do_pBtn_add_Clicked()
  82. {
  83. CompareItemDialog dlg;
  84. /* 设置默认参数 */
  85. dlg.setDefaultParams(GInfo.getDefaultCompareItem());
  86. dlg.exec();
  87. /* 判断是否按下了确定按钮 */
  88. if(!dlg.isOK())
  89. {
  90. return; /* 如果没有按下确定按钮,直接返回 */
  91. }
  92. /* 获取对比项信息 */
  93. CompareItemInfo_t ciInfo = dlg.getCompareItemInfo();
  94. /* 获取一个未使用的对比项ID */
  95. int id = CIData.getUnusedCompareItemID();
  96. /* 添加到全局对比项数据中 */
  97. ciInfo.nID = id; /* 设置对比项ID */
  98. CIData.addCompareItem(ciInfo);
  99. /* 添加到表格中 */
  100. CompareItemTableItem_t tableItem;
  101. tableItem.nSerialNum = m_model->rowCount() + 1; /* 序号 */
  102. tableItem.nID = ciInfo.nID; /* 对比项ID */
  103. tableItem.strName = ciInfo.strName; /* 对比项名称 */
  104. tableItem.isEnable = ciInfo.isEnable; /* 对比项状态 */
  105. tableItem.nChannelCount = ciInfo.mapRoad.size(); /* 通道数 */
  106. addRow(tableItem);
  107. }
  108. /* 点击了删除按钮 */
  109. void CompareItemListDialog::do_pBtn_delete_Clicked()
  110. {
  111. /* 获取是否有选中的行 */
  112. QModelIndexList selectedRows = ui->tableView->selectionModel()->selectedRows();
  113. if(selectedRows.isEmpty())
  114. {
  115. TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择要删除的对比项", GInfo.getTopWindow());
  116. return;
  117. }
  118. /* 确认删除 */
  119. Warning w;
  120. w.setTitle("删除对比项");
  121. w.setText("是否确认删除选中的对比项?");
  122. w.exec();
  123. if(!w.isOk())
  124. {
  125. return; /* 如果没有按下确定按钮,直接返回 */
  126. }
  127. /* 删除选中的行 */
  128. for(const QModelIndex& index : selectedRows)
  129. {
  130. /* 获取对比项ID */
  131. int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
  132. /* 从全局对比项数据中删除 */
  133. CIData.removeCompareItem(nID);
  134. /* 从表格模型中删除 */
  135. m_model->removeRow(index.row());
  136. }
  137. }
  138. /* 点击了编辑按钮 */
  139. void CompareItemListDialog::do_pBtn_edit_Clicked()
  140. {
  141. /* 获取是否有选中的行 */
  142. QModelIndexList selectedRows = ui->tableView->selectionModel()->selectedRows();
  143. if(selectedRows.isEmpty())
  144. {
  145. TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择要编辑的对比项", GInfo.getTopWindow());
  146. return;
  147. }
  148. /* 只取出第一个 */
  149. QModelIndex index = selectedRows.first();
  150. /* 获取对比项ID */
  151. int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
  152. /* 查找对比项信息 */
  153. CompareItemInfo_t ciInfo = CIData.findCompareItemByID(nID);
  154. if(ciInfo.nID < 0)
  155. {
  156. TipWidget::display(TipWidget::OPERATOR_WARN, "对比项不存在,无法编辑", GInfo.getTopWindow());
  157. SPDLOG_LOGGER_WARN(m_logger, "对比项ID {} 不存在,无法编辑", nID);
  158. return;
  159. }
  160. /* 打开对比项编辑对话框 */
  161. CompareItemDialog dlg;
  162. /* 设置默认参数 */
  163. dlg.setDefaultParams(ciInfo);
  164. dlg.exec();
  165. /* 判断是否按下了确定按钮 */
  166. if(!dlg.isOK())
  167. {
  168. return; /* 如果没有按下确定按钮,直接返回 */
  169. }
  170. /* 获取对比项信息 */
  171. CompareItemInfo_t newCiInfo = dlg.getCompareItemInfo();
  172. /* 修改全局对比项数据 */
  173. if(!CIData.modifyCompareItem(newCiInfo))
  174. {
  175. TipWidget::display(TipWidget::OPERATOR_WARN, "对比项修改失败,请稍后重试", GInfo.getTopWindow());
  176. SPDLOG_LOGGER_ERROR(m_logger, "对比项ID {} 修改失败", nID);
  177. return;
  178. }
  179. /* 判断有没有修改启用状态 */
  180. if(newCiInfo.isEnable != ciInfo.isEnable)
  181. {
  182. /* 如果启用状态有变化,更新表格中的状态 */
  183. m_model->setData(m_model->index(index.row(), 1), newCiInfo.isEnable ? "启用" : "未启用");
  184. }
  185. }
  186. /* 启用对比项 */
  187. void CompareItemListDialog::do_pBtn_enable_Clicked()
  188. {
  189. /* 获取当前选中的行 */
  190. QModelIndexList selectedRows = ui->tableView->selectionModel()->selectedRows();
  191. if(selectedRows.isEmpty())
  192. {
  193. TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择要修改的对比项", GInfo.getTopWindow());
  194. return;
  195. }
  196. /* 只取出第一个 */
  197. QModelIndex index = selectedRows.first();
  198. /* 获取对比项ID */
  199. int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
  200. /* 查找对比项信息 */
  201. CompareItemInfo_t ciInfo = CIData.findCompareItemByID(nID);
  202. if(ciInfo.nID < 0)
  203. {
  204. TipWidget::display(TipWidget::OPERATOR_WARN, "对比项不存在,无法启用", GInfo.getTopWindow());
  205. SPDLOG_LOGGER_WARN(m_logger, "对比项ID {} 不存在,无法启用", nID);
  206. return;
  207. }
  208. /* 判断是否已经启用 */
  209. if(ciInfo.isEnable)
  210. {
  211. TipWidget::display(TipWidget::OPERATOR_OK, "对比项已经处于启用状态", GInfo.getTopWindow());
  212. return; /* 如果已经启用,直接返回 */
  213. }
  214. /* 修改对比项状态为启用 */
  215. ciInfo.isEnable = true;
  216. if(!CIData.modifyCompareItem(ciInfo))
  217. {
  218. TipWidget::display(TipWidget::OPERATOR_WARN, "对比项启用失败,请稍后重试", GInfo.getTopWindow());
  219. SPDLOG_LOGGER_ERROR(m_logger, "对比项ID {} 启用失败", nID);
  220. return;
  221. }
  222. /* 更新表格中的状态 */
  223. m_model->setData(m_model->index(index.row(), 1), "启用");
  224. }
  225. /* 禁用对比项 */
  226. void CompareItemListDialog::do_pBtn_disable_Clicked()
  227. {
  228. /* 获取当前选中的行 */
  229. QModelIndexList selectedRows = ui->tableView->selectionModel()->selectedRows();
  230. if(selectedRows.isEmpty())
  231. {
  232. TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择要修改的对比项", GInfo.getTopWindow());
  233. return;
  234. }
  235. /* 只取出第一个 */
  236. QModelIndex index = selectedRows.first();
  237. /* 获取对比项ID */
  238. int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
  239. /* 查找对比项信息 */
  240. CompareItemInfo_t ciInfo = CIData.findCompareItemByID(nID);
  241. if(ciInfo.nID < 0)
  242. {
  243. TipWidget::display(TipWidget::OPERATOR_WARN, "对比项不存在,无法禁用", GInfo.getTopWindow());
  244. SPDLOG_LOGGER_WARN(m_logger, "对比项ID {} 不存在,无法禁用", nID);
  245. return;
  246. }
  247. /* 判断是否已经启用 */
  248. if(!ciInfo.isEnable)
  249. {
  250. TipWidget::display(TipWidget::OPERATOR_OK, "对比项已经处于禁用状态", GInfo.getTopWindow());
  251. return;
  252. }
  253. /* 修改对比项状态为启用 */
  254. ciInfo.isEnable = false;
  255. if(!CIData.modifyCompareItem(ciInfo))
  256. {
  257. TipWidget::display(TipWidget::OPERATOR_WARN, "对比项禁用失败,请稍后重试", GInfo.getTopWindow());
  258. SPDLOG_LOGGER_ERROR(m_logger, "对比项ID {} 禁用失败", nID);
  259. return;
  260. }
  261. /* 更新表格中的状态 */
  262. m_model->setData(m_model->index(index.row(), 1), "未启用");
  263. }
  264. /* 显示详情 */
  265. void CompareItemListDialog::do_tableView_doubleClicked(const QModelIndex &index)
  266. {
  267. /* 判断是不是第4列 */
  268. if(index.column() != 4)
  269. {
  270. /* 如果不是第4列,直接返回 */
  271. return;
  272. }
  273. /* 获取对比项ID */
  274. int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
  275. /* 查找对比项信息 */
  276. CompareItemInfo_t ciInfo = CIData.findCompareItemByID(nID);
  277. if(ciInfo.nID < 0)
  278. {
  279. TipWidget::display(TipWidget::OPERATOR_WARN, "对比项不存在,无法查看详情", GInfo.getTopWindow());
  280. SPDLOG_LOGGER_WARN(m_logger, "对比项ID {} 不存在,无法查看详情", nID);
  281. return;
  282. }
  283. /* 打开弹窗 */
  284. CompareItemDetailWidget* detailWidget = new CompareItemDetailWidget(GInfo.getTopWindow());
  285. /* 设置对比项信息 */
  286. detailWidget->setCompareItemInfo(ciInfo);
  287. detailWidget->exec();
  288. }
  289. /* 初始化表格 */
  290. void CompareItemListDialog::initTable()
  291. {
  292. /* 初始化视图模型 */
  293. m_model = new QStandardItemModel(this);
  294. m_model->setColumnCount(5);
  295. /* 设置每一列的标题 */
  296. m_model->setHeaderData(0, Qt::Horizontal, "序号");
  297. m_model->setHeaderData(1, Qt::Horizontal, "状态");
  298. m_model->setHeaderData(2, Qt::Horizontal, "对比项");
  299. m_model->setHeaderData(3, Qt::Horizontal, "通道数");
  300. m_model->setHeaderData(4, Qt::Horizontal, "操作");
  301. // m_model->clear();
  302. // m_sortModel = new CSortModel(this);
  303. // m_sortModel->setSourceModel(m_model);
  304. // m_sortModel->sort(0, Qt::AscendingOrder); /* 默认升序 */
  305. /* 设置排序数据 */
  306. // m_sortModel->setSortRole(QtUserRole::UserRole_Time); /* 设置排序角色 */
  307. ui->tableView->setModel(m_model);
  308. // 设置选择模式为整行选择
  309. auto oneHeader = new BaseHeader(ui->tableView);
  310. oneHeader->SetCheckable(true);
  311. ui->tableView->setHorizontalHeader(oneHeader);
  312. ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
  313. ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
  314. /*--------------------------- 设置横向标题 -------------------------------*/
  315. /* 设置横向标题可见 */
  316. ui->tableView->horizontalHeader()->setVisible(true);
  317. /* 设置标题左对齐 */
  318. ui->tableView->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
  319. /* 设置横向标题不可点击 */
  320. ui->tableView->horizontalHeader()->setSectionsClickable(false);
  321. /*--------------------------- 设置列 -------------------------------*/
  322. /* 设置每列的高度 */
  323. ui->tableView->verticalHeader()->setDefaultSectionSize(48);
  324. /* 设置横向表头高度为48像素(可根据需要调整) */
  325. ui->tableView->horizontalHeader()->setFixedHeight(48);
  326. /* 设置列宽度固定 */
  327. ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
  328. /* 去掉列标题 */
  329. ui->tableView->verticalHeader()->setVisible(false);
  330. /* 去掉网格线 */
  331. ui->tableView->setShowGrid(false);
  332. /* 设置单元格不可编辑 */
  333. ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
  334. /* 禁止显示横向滚动条 */
  335. // ui->tableView->horizontalHeader()->setStretchLastSection(true); /* 设置最后一列拉伸 */
  336. /* 设置固定列宽度 */
  337. ui->tableView->setColumnWidth(0, 160); /* 第一列宽度 */
  338. ui->tableView->setColumnWidth(1, 160); /* 第二列宽度 */
  339. ui->tableView->setColumnWidth(2, 240); /* 第三列宽度 */
  340. ui->tableView->setColumnWidth(3, 280); /* 第四列宽度 */
  341. ui->tableView->setColumnWidth(4, 96); /* 第五列宽度 */
  342. /* 测试用,加入两列数据 */
  343. // for(int i = 0; i < 10; ++i)
  344. // {
  345. // CompareItemTableItem_t item;
  346. // item.nSerialNum = i + 1; /* 序号 */
  347. // item.nID = i + 1000; /* 对比项ID */
  348. // item.strName = QString("对比项%1").arg(i + 1); /* 对比项名称 */
  349. // item.isEnable = (i % 2 == 0); /* 偶数启用,奇数未启用 */
  350. // item.nChannelCount = i + 1; /* 通道数 */
  351. // addRow(item);
  352. // }
  353. }
  354. /* 添加一行 */
  355. void CompareItemListDialog::addRow(CompareItemTableItem_t tableItem)
  356. {
  357. QList<QStandardItem*> items;
  358. /* -------------------- 序号 -------------------- */
  359. QStandardItem* item0 = new QStandardItem(QString::number(tableItem.nSerialNum));
  360. item0->setCheckable(true);
  361. item0->setCheckState(Qt::Unchecked);
  362. items.append(item0);
  363. /* 保存这个对比项的ID */
  364. item0->setData(tableItem.nID, m_userRole_CompareItemID);
  365. /* -------------------- 状态 -------------------- */
  366. QString status = tableItem.isEnable ? "启用" : "未启用";
  367. items.append(new QStandardItem(status));
  368. /* -------------------- 对比项 -------------------- */
  369. items.append(new QStandardItem(tableItem.strName));
  370. /* -------------------- 通道数 -------------------- */
  371. items.append(new QStandardItem(QString::number(tableItem.nChannelCount)));
  372. /* -------------------- 详情 -------------------- */
  373. QStandardItem* item4 = new QStandardItem("详情");
  374. /* 这个字体设置为蓝色 */
  375. item4->setForeground(QBrush("#438EFF"));
  376. items.append(item4);
  377. m_model->appendRow(items);
  378. }