compareitemlistdialog.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  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. /* 重载比较函数 */
  11. bool CSortModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
  12. {
  13. // /* 先比较是正常日还是特殊日 */
  14. // auto leftDay = sourceModel()->data(left, UserRole_WeekDay).toInt();
  15. // auto rightDay = sourceModel()->data(right, UserRole_WeekDay).toInt();
  16. // if(leftDay != rightDay)
  17. // {
  18. // return leftDay < rightDay; /* 比较周几 */
  19. // }
  20. // /* 日期类型相等,再比较时间 */
  21. // auto leftTime = sourceModel()->data(left, UserRole_Time).toDateTime();
  22. // auto rightTime = sourceModel()->data(right, UserRole_Time).toDateTime();
  23. // if(leftDay == static_cast<int>(enum_WeekDay::WeekDay_Special))
  24. // {
  25. // /* 特殊日,比较日期和时间 */
  26. // return leftTime < rightTime;
  27. // }else {
  28. // /* 正常日,只比较时间 */
  29. // return leftTime.time() < rightTime.time();
  30. // }
  31. return true;
  32. }
  33. CompareItemListDialog::CompareItemListDialog(QWidget *parent) :
  34. DialogBase(parent),
  35. ui(new Ui::CompareItemListWidget)
  36. {
  37. QWidget *widgetContent = new QWidget(this);
  38. ui->setupUi(widgetContent);
  39. /* 设置内容 */
  40. setContentWidget(widgetContent);
  41. /* 移除底栏 */
  42. removeBottomWidget();
  43. /* 设置标题 */
  44. setTitle("对比项列表", QSize(120, 18));
  45. UIStyle.registerWidget(widgetContent);
  46. // SPDLOG_LOGGER_DEBUG(m_logger, "ObjectName: {}", widgetContent->objectName().toStdString());
  47. this->resize(1000 + 40, 800 + 40); /* 设置对话框大小,包含阴影的宽度 */
  48. /* 连接信号和槽 */
  49. connect(ui->pBtn_close, &QPushButton::clicked, this, &CompareItemListDialog::do_pBtn_close_Clicked);
  50. connect(ui->pBtn_add, &QPushButton::clicked, this, &CompareItemListDialog::do_pBtn_add_Clicked);
  51. connect(ui->pBtn_delete, &QPushButton::clicked, this, &CompareItemListDialog::do_pBtn_delete_Clicked);
  52. connect(ui->pBtn_modify, &QPushButton::clicked, this, &CompareItemListDialog::do_pBtn_edit_Clicked);
  53. /* 初始化表格 */
  54. initTable();
  55. }
  56. CompareItemListDialog::~CompareItemListDialog()
  57. {
  58. UIStyle.unregisterWidget(getContentWidget());
  59. delete ui;
  60. }
  61. /* 设置已有的对比项数据 */
  62. void CompareItemListDialog::setCompareItemList(const QList<CompareItemTableItem_t>& list)
  63. {
  64. for(const CompareItemTableItem_t& item : list)
  65. {
  66. /* 添加到表格中 */
  67. addRow(item);
  68. }
  69. }
  70. /* 点击了关闭按钮 */
  71. void CompareItemListDialog::do_pBtn_close_Clicked()
  72. {
  73. this->close();
  74. }
  75. /* 点击了添加按钮 */
  76. void CompareItemListDialog::do_pBtn_add_Clicked()
  77. {
  78. CompareItemDialog dlg;
  79. /* 设置默认参数 */
  80. dlg.setDefaultParams(GInfo.getDefaultCompareItem());
  81. dlg.exec();
  82. /* 判断是否按下了确定按钮 */
  83. if(!dlg.isOK())
  84. {
  85. return; /* 如果没有按下确定按钮,直接返回 */
  86. }
  87. /* 获取对比项信息 */
  88. CompareItemInfo_t ciInfo = dlg.getCompareItemInfo();
  89. /* 获取一个未使用的对比项ID */
  90. int id = CIData.getUnusedCompareItemID();
  91. /* 添加到全局对比项数据中 */
  92. ciInfo.nID = id; /* 设置对比项ID */
  93. CIData.addCompareItem(ciInfo);
  94. /* 添加到表格中 */
  95. CompareItemTableItem_t tableItem;
  96. tableItem.nSerialNum = m_model->rowCount() + 1; /* 序号 */
  97. tableItem.nID = ciInfo.nID; /* 对比项ID */
  98. tableItem.strName = ciInfo.strName; /* 对比项名称 */
  99. tableItem.isEnable = ciInfo.isEnable; /* 对比项状态 */
  100. tableItem.nChannelCount = ciInfo.listRoads.size(); /* 通道数 */
  101. addRow(tableItem);
  102. }
  103. /* 点击了删除按钮 */
  104. void CompareItemListDialog::do_pBtn_delete_Clicked()
  105. {
  106. /* 获取是否有选中的行 */
  107. QModelIndexList selectedRows = ui->tableView->selectionModel()->selectedRows();
  108. if(selectedRows.isEmpty())
  109. {
  110. TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择要删除的对比项", this);
  111. return;
  112. }
  113. /* 确认删除 */
  114. Warning w;
  115. w.setTitle("删除对比项");
  116. w.setText("是否确认删除选中的对比项?");
  117. w.exec();
  118. if(!w.isOk())
  119. {
  120. return; /* 如果没有按下确定按钮,直接返回 */
  121. }
  122. /* 删除选中的行 */
  123. for(const QModelIndex& index : selectedRows)
  124. {
  125. /* 获取对比项ID */
  126. int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
  127. /* 从全局对比项数据中删除 */
  128. CIData.removeCompareItem(nID);
  129. /* 从表格模型中删除 */
  130. m_model->removeRow(index.row());
  131. }
  132. }
  133. /* 点击了编辑按钮 */
  134. void CompareItemListDialog::do_pBtn_edit_Clicked()
  135. {
  136. /* 获取是否有选中的行 */
  137. QModelIndexList selectedRows = ui->tableView->selectionModel()->selectedRows();
  138. if(selectedRows.isEmpty())
  139. {
  140. TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择要编辑的对比项", this);
  141. return;
  142. }
  143. /* 只取出第一个 */
  144. QModelIndex index = selectedRows.first();
  145. /* 获取对比项ID */
  146. int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
  147. /* 查找对比项信息 */
  148. CompareItemInfo_t ciInfo = CIData.findCompareItemByID(nID);
  149. if(ciInfo.nID < 0)
  150. {
  151. TipWidget::display(TipWidget::OPERATOR_WARN, "对比项不存在,无法编辑", this);
  152. SPDLOG_LOGGER_WARN(m_logger, "对比项ID {} 不存在,无法编辑", nID);
  153. return;
  154. }
  155. /* 打开对比项编辑对话框 */
  156. CompareItemDialog dlg;
  157. /* 设置默认参数 */
  158. dlg.setDefaultParams(ciInfo);
  159. dlg.exec();
  160. /* 判断是否按下了确定按钮 */
  161. if(!dlg.isOK())
  162. {
  163. return; /* 如果没有按下确定按钮,直接返回 */
  164. }
  165. /* 获取对比项信息 */
  166. CompareItemInfo_t newCiInfo = dlg.getCompareItemInfo();
  167. /* 修改全局对比项数据 */
  168. if(!CIData.modifyCompareItem(newCiInfo))
  169. {
  170. TipWidget::display(TipWidget::OPERATOR_WARN, "对比项修改失败,请稍后重试", this);
  171. SPDLOG_LOGGER_ERROR(m_logger, "对比项ID {} 修改失败", nID);
  172. return;
  173. }
  174. }
  175. /* 初始化表格 */
  176. void CompareItemListDialog::initTable()
  177. {
  178. /* 初始化视图模型 */
  179. m_model = new QStandardItemModel(this);
  180. m_model->setColumnCount(5);
  181. /* 设置每一列的标题 */
  182. m_model->setHeaderData(0, Qt::Horizontal, "序号");
  183. m_model->setHeaderData(1, Qt::Horizontal, "状态");
  184. m_model->setHeaderData(2, Qt::Horizontal, "对比项");
  185. m_model->setHeaderData(3, Qt::Horizontal, "通道数");
  186. m_model->setHeaderData(4, Qt::Horizontal, "操作");
  187. // m_model->clear();
  188. // m_sortModel = new CSortModel(this);
  189. // m_sortModel->setSourceModel(m_model);
  190. // m_sortModel->sort(0, Qt::AscendingOrder); /* 默认升序 */
  191. /* 设置排序数据 */
  192. // m_sortModel->setSortRole(QtUserRole::UserRole_Time); /* 设置排序角色 */
  193. ui->tableView->setModel(m_model);
  194. // 设置选择模式为整行选择
  195. ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
  196. ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
  197. /*--------------------------- 设置横向标题 -------------------------------*/
  198. /* 设置横向标题可见 */
  199. ui->tableView->horizontalHeader()->setVisible(true);
  200. /* 设置标题左对齐 */
  201. ui->tableView->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
  202. /* 设置横向标题不可点击 */
  203. ui->tableView->horizontalHeader()->setSectionsClickable(false);
  204. /*--------------------------- 设置列 -------------------------------*/
  205. /* 设置每列的高度 */
  206. ui->tableView->verticalHeader()->setDefaultSectionSize(48);
  207. /* 设置横向表头高度为48像素(可根据需要调整) */
  208. ui->tableView->horizontalHeader()->setFixedHeight(48);
  209. /* 设置列宽度固定 */
  210. ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
  211. /* 去掉列标题 */
  212. ui->tableView->verticalHeader()->setVisible(false);
  213. /* 去掉网格线 */
  214. ui->tableView->setShowGrid(false);
  215. /* 设置单元格不可编辑 */
  216. ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
  217. /* 禁止显示横向滚动条 */
  218. // ui->tableView->horizontalHeader()->setStretchLastSection(true); /* 设置最后一列拉伸 */
  219. /* 设置固定列宽度 */
  220. ui->tableView->setColumnWidth(0, 160); /* 第一列宽度 */
  221. ui->tableView->setColumnWidth(1, 160); /* 第二列宽度 */
  222. ui->tableView->setColumnWidth(2, 240); /* 第三列宽度 */
  223. ui->tableView->setColumnWidth(3, 280); /* 第四列宽度 */
  224. ui->tableView->setColumnWidth(4, 96); /* 第五列宽度 */
  225. /* 测试用,加入两列数据 */
  226. // for(int i = 0; i < 10; ++i)
  227. // {
  228. // CompareItemTableItem_t item;
  229. // item.nSerialNum = i + 1; /* 序号 */
  230. // item.nID = i + 1000; /* 对比项ID */
  231. // item.strName = QString("对比项%1").arg(i + 1); /* 对比项名称 */
  232. // item.isEnable = (i % 2 == 0); /* 偶数启用,奇数未启用 */
  233. // item.nChannelCount = i + 1; /* 通道数 */
  234. // addRow(item);
  235. // }
  236. }
  237. /* 添加一行 */
  238. void CompareItemListDialog::addRow(CompareItemTableItem_t tableItem)
  239. {
  240. QList<QStandardItem*> items;
  241. /* 序号 */
  242. QStandardItem* item0 = new QStandardItem(QString::number(tableItem.nSerialNum));
  243. item0->setCheckable(true);
  244. item0->setCheckState(Qt::Unchecked);
  245. items.append(item0);
  246. /* 保存这个对比项的ID */
  247. item0->setData(tableItem.nID, m_userRole_CompareItemID);
  248. /* 状态 */
  249. QString status = tableItem.isEnable ? "启用" : "未启用";
  250. items.append(new QStandardItem(status));
  251. /* 对比项 */
  252. items.append(new QStandardItem(tableItem.strName));
  253. /* 通道数 */
  254. items.append(new QStandardItem(QString::number(tableItem.nChannelCount)));
  255. /* 操作 */
  256. items.append(new QStandardItem("详情"));
  257. m_model->appendRow(items);
  258. }