compareitemlistdialog.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
  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. #include "DelegateCheckBox.h"
  13. /* 重载比较函数 */
  14. bool CSortModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
  15. {
  16. // /* 先比较是正常日还是特殊日 */
  17. // auto leftDay = sourceModel()->data(left, UserRole_WeekDay).toInt();
  18. // auto rightDay = sourceModel()->data(right, UserRole_WeekDay).toInt();
  19. // if(leftDay != rightDay)
  20. // {
  21. // return leftDay < rightDay; /* 比较周几 */
  22. // }
  23. // /* 日期类型相等,再比较时间 */
  24. // auto leftTime = sourceModel()->data(left, UserRole_Time).toDateTime();
  25. // auto rightTime = sourceModel()->data(right, UserRole_Time).toDateTime();
  26. // if(leftDay == static_cast<int>(enum_WeekDay::WeekDay_Special))
  27. // {
  28. // /* 特殊日,比较日期和时间 */
  29. // return leftTime < rightTime;
  30. // }else {
  31. // /* 正常日,只比较时间 */
  32. // return leftTime.time() < rightTime.time();
  33. // }
  34. return true;
  35. }
  36. CompareItemListDialog::CompareItemListDialog(QWidget *parent) :
  37. DialogBase(parent),
  38. ui(new Ui::CompareItemListWidget)
  39. {
  40. QWidget *widgetContent = new QWidget(this);
  41. ui->setupUi(widgetContent);
  42. /* 设置内容 */
  43. setContentWidget(widgetContent);
  44. /* 移除底栏 */
  45. removeBottomWidget();
  46. /* 设置标题 */
  47. setTitle("对比项列表", QSize(120, 18));
  48. // UIStyle.registerWidget(widgetContent);
  49. // SPDLOG_LOGGER_DEBUG(m_logger, "ObjectName: {}", widgetContent->objectName().toStdString());
  50. this->resize(1000 + 40, 800 + 40); /* 设置对话框大小,包含阴影的宽度 */
  51. /* 连接信号和槽 */
  52. connect(ui->pBtn_close, &QPushButton::clicked, this, &CompareItemListDialog::do_pBtn_close_Clicked);
  53. connect(ui->pBtn_add, &QPushButton::clicked, this, &CompareItemListDialog::do_pBtn_add_Clicked);
  54. connect(ui->pBtn_delete, &QPushButton::clicked, this, &CompareItemListDialog::do_pBtn_delete_Clicked);
  55. connect(ui->pBtn_modify, &QPushButton::clicked, this, &CompareItemListDialog::do_pBtn_edit_Clicked);
  56. connect(ui->pBtn_enableCPItem, &QPushButton::clicked, this, &CompareItemListDialog::do_pBtn_enable_Clicked);
  57. connect(ui->pBtn_disableCPItem, &QPushButton::clicked, this, &CompareItemListDialog::do_pBtn_disable_Clicked);
  58. /* 初始化表格 */
  59. initTable();
  60. UIStyle.registerWidget(widgetContent);
  61. }
  62. CompareItemListDialog::~CompareItemListDialog()
  63. {
  64. UIStyle.unregisterWidget(getContentWidget());
  65. delete ui;
  66. }
  67. /* 设置已有的对比项数据 */
  68. void CompareItemListDialog::setCompareItemList(const QList<CompareItemTableItem_t>& list)
  69. {
  70. for(const CompareItemTableItem_t& item : list)
  71. {
  72. /* 添加到表格中 */
  73. addRow(item);
  74. }
  75. }
  76. /* 点击了关闭按钮 */
  77. void CompareItemListDialog::do_pBtn_close_Clicked()
  78. {
  79. this->close();
  80. }
  81. /* 点击了添加按钮 */
  82. void CompareItemListDialog::do_pBtn_add_Clicked()
  83. {
  84. /* 获取当前所有的对比项名称 */
  85. QList<QString> listItemNames = CIData.getCompareItemNameList();
  86. CompareItemDialog dlg;
  87. /* 设置默认参数 */
  88. dlg.setDefaultParams(GInfo.getDefaultCompareItem());
  89. /* 设置对比项名称列表 */
  90. dlg.setCompareItemNameList(listItemNames);
  91. dlg.exec();
  92. /* 判断是否按下了确定按钮 */
  93. if(!dlg.isOK())
  94. {
  95. return; /* 如果没有按下确定按钮,直接返回 */
  96. }
  97. /* 获取对比项信息 */
  98. CompareItemInfo_t ciInfo = dlg.getCompareItemInfo();
  99. /* 获取一个未使用的对比项ID */
  100. int id = CIData.getUnusedCompareItemID();
  101. /* 添加到全局对比项数据中 */
  102. ciInfo.nID = id; /* 设置对比项ID */
  103. CIData.addCompareItem(ciInfo);
  104. /* 添加到表格中 */
  105. CompareItemTableItem_t tableItem;
  106. tableItem.nSerialNum = m_model->rowCount() + 1; /* 序号 */
  107. tableItem.nID = ciInfo.nID; /* 对比项ID */
  108. tableItem.strName = ciInfo.strName; /* 对比项名称 */
  109. tableItem.isEnable = ciInfo.isEnable; /* 对比项状态 */
  110. tableItem.nChannelCount = ciInfo.mapRoad.size(); /* 通道数 */
  111. addRow(tableItem);
  112. TipWidget::display(TipWidget::OPERATOR_OK, "对比项新增成功", this);
  113. }
  114. /* 点击了删除按钮 */
  115. void CompareItemListDialog::do_pBtn_delete_Clicked()
  116. {
  117. /* 获取第一列选中的列,以CheckBox选中为准,获取到需要删除的对比项ID */
  118. QList<int> listCheckedID;
  119. for(int i = m_model->rowCount() - 1; i >= 0; --i)
  120. {
  121. bool isChecked = m_model->data(m_model->index(i, 0), Qt::CheckStateRole).toBool();
  122. if(isChecked)
  123. {
  124. int nID = m_model->data(m_model->index(i, 0), m_userRole_CompareItemID).toInt();
  125. listCheckedID.push_back(nID);
  126. }
  127. }
  128. if(listCheckedID.isEmpty())
  129. {
  130. TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择要删除的对比项", GInfo.getTopWindow());
  131. return;
  132. }
  133. /* 确认删除 */
  134. Warning w;
  135. w.setTitle("删除对比项");
  136. w.setText("是否确认删除选中的对比项?");
  137. w.exec();
  138. if(!w.isOk())
  139. {
  140. return; /* 如果没有按下确定按钮,直接返回 */
  141. }
  142. /* 删除选中的行 */
  143. // for(const QModelIndex& index : selectedRows)
  144. // {
  145. // /* 获取对比项ID */
  146. // // int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
  147. // // int nID = m_model->data(index, m_userRole_CompareItemID).toInt();
  148. // int nID = index.data(m_userRole_CompareItemID).toInt();
  149. // // SPDLOG_LOGGER_INFO(m_logger, "删除对比项ID: {}", nID);
  150. // /* 从全局对比项数据中删除 */
  151. // CIData.removeCompareItem(nID);
  152. // }
  153. /* 删除表格中的数据,需要倒叙删除,因为 selectedRows 也会继续向 m_model 获取数据 */
  154. // for (int i = selectedRows.size() - 1; i >= 0; --i)
  155. // {
  156. // m_model->removeRow(selectedRows[i].row());
  157. // }
  158. /* 获取第一列选中的列,以CheckBox选中为准,获取到需要删除的对比项ID */
  159. for(int i = m_model->rowCount() - 1; i >= 0; --i)
  160. {
  161. bool isChecked = m_model->data(m_model->index(i, 0), Qt::CheckStateRole).toBool();
  162. if(isChecked)
  163. {
  164. int nID = m_model->data(m_model->index(i, 0), m_userRole_CompareItemID).toInt();
  165. CIData.removeCompareItem(nID);
  166. m_model->removeRow(i);
  167. }
  168. }
  169. /* 重新排序 */
  170. for(int i = 0; i < m_model->rowCount(); i++)
  171. {
  172. m_model->setData(m_model->index(i, 0), i + 1);
  173. }
  174. }
  175. /* 点击了编辑按钮 */
  176. void CompareItemListDialog::do_pBtn_edit_Clicked()
  177. {
  178. /* 获取第一列选中的列,以CheckBox选中为准,获取到需要删除的对比项ID */
  179. std::map<int, QModelIndex> mapCheckedID;
  180. for(int i = m_model->rowCount() - 1; i >= 0; --i)
  181. {
  182. bool isChecked = m_model->data(m_model->index(i, 0), Qt::CheckStateRole).toBool();
  183. if(isChecked)
  184. {
  185. int nID = m_model->data(m_model->index(i, 0), m_userRole_CompareItemID).toInt();
  186. mapCheckedID[nID] = m_model->index(i, 1);
  187. }
  188. }
  189. if(mapCheckedID.empty())
  190. {
  191. TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择要编辑的对比项", GInfo.getTopWindow());
  192. return;
  193. }
  194. bool isMultiEdit = false;
  195. if(mapCheckedID.size() == 1)
  196. {
  197. isMultiEdit = false;
  198. }else {
  199. isMultiEdit = true;
  200. }
  201. /* 获取对比项ID */
  202. int nID = mapCheckedID.begin()->first;
  203. /* 查找对比项信息 */
  204. CompareItemInfo_t ciInfo = CIData.findCompareItemByID(nID);
  205. if(ciInfo.nID < 0)
  206. {
  207. TipWidget::display(TipWidget::OPERATOR_WARN, "对比项不存在,无法编辑", GInfo.getTopWindow());
  208. SPDLOG_LOGGER_WARN(m_logger, "对比项ID {} 不存在,无法编辑", nID);
  209. return;
  210. }
  211. QList<QString> listItemNames = CIData.getCompareItemNameList();
  212. /* 打开对比项编辑对话框 */
  213. CompareItemDialog dlg;
  214. /* 设置默认参数 */
  215. dlg.setDefaultParams(ciInfo);
  216. dlg.setMultiEditMode(isMultiEdit);
  217. dlg.setCompareItemNameList(listItemNames);
  218. dlg.exec();
  219. /* 判断是否按下了确定按钮 */
  220. if(!dlg.isOK())
  221. {
  222. return; /* 如果没有按下确定按钮,直接返回 */
  223. }
  224. /* 获取对比项信息 */
  225. CompareItemInfo_t newCiInfo = dlg.getCompareItemInfo();
  226. if(isMultiEdit)
  227. {
  228. bool isMainEnabled = newCiInfo.mapRoad[1].isEnableRecord;
  229. bool isSecondEnabled = newCiInfo.mapRoad[2].isEnableRecord;
  230. /* 处理多项编辑,挨个获取对比项信息修改 */
  231. for(auto& pair : mapCheckedID)
  232. {
  233. auto item = CIData.findCompareItemByID(pair.first);
  234. item.mapRoad[1].isEnableRecord = isMainEnabled; /* 主通道是否开启录音 */
  235. item.mapRoad[2].isEnableRecord = isSecondEnabled; /* 第二通道是否开启录音 */
  236. item.setVolumeDetectParams(newCiInfo); /* 修改音量检测参数 */
  237. /* 判断有没有修改启用状态 */
  238. if(newCiInfo.isEnable != item.isEnable)
  239. {
  240. item.isEnable = newCiInfo.isEnable; /* 修改启用状态 */
  241. /* 如果启用状态有变化,更新表格中的状态 */
  242. m_model->setData(pair.second, newCiInfo.isEnable ? "启用" : "未启用");
  243. }
  244. CIData.modifyCompareItem(item);
  245. }
  246. }else
  247. {
  248. /* 修改全局对比项数据 */
  249. if(!CIData.modifyCompareItem(newCiInfo))
  250. {
  251. TipWidget::display(TipWidget::OPERATOR_WARN, "对比项修改失败,请稍后重试", GInfo.getTopWindow());
  252. SPDLOG_LOGGER_ERROR(m_logger, "对比项ID {} 修改失败", nID);
  253. return;
  254. }
  255. auto index = mapCheckedID.begin()->second;
  256. /* 判断有没有修改启用状态 */
  257. if(newCiInfo.isEnable != ciInfo.isEnable)
  258. {
  259. /* 如果启用状态有变化,更新表格中的状态 */
  260. m_model->setData(index, newCiInfo.isEnable ? "启用" : "未启用");
  261. }
  262. }
  263. }
  264. /* 启用对比项 */
  265. void CompareItemListDialog::do_pBtn_enable_Clicked()
  266. {
  267. /* 获取当前选中的行 */
  268. QModelIndexList selectedRows = ui->tableView->selectionModel()->selectedRows();
  269. if(selectedRows.isEmpty())
  270. {
  271. TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择要修改的对比项", GInfo.getTopWindow());
  272. return;
  273. }
  274. for(auto& index : selectedRows)
  275. {
  276. /* 获取对比项ID */
  277. int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
  278. /* 查找对比项信息 */
  279. CompareItemInfo_t ciInfo = CIData.findCompareItemByID(nID);
  280. if(ciInfo.nID < 0)
  281. {
  282. TipWidget::display(TipWidget::OPERATOR_WARN, "对比项不存在,无法启用", GInfo.getTopWindow());
  283. SPDLOG_LOGGER_WARN(m_logger, "对比项ID {} 不存在,无法启用", nID);
  284. return;
  285. }
  286. /* 判断是否已经启用 */
  287. if(ciInfo.isEnable)
  288. {
  289. // TipWidget::display(TipWidget::OPERATOR_OK, "对比项已经处于启用状态", GInfo.getTopWindow());
  290. return; /* 如果已经启用,直接返回 */
  291. }
  292. /* 修改对比项状态为启用 */
  293. ciInfo.isEnable = true;
  294. if(!CIData.modifyCompareItem(ciInfo))
  295. {
  296. TipWidget::display(TipWidget::OPERATOR_WARN, "对比项启用失败,请稍后重试", GInfo.getTopWindow());
  297. SPDLOG_LOGGER_ERROR(m_logger, "对比项ID {} 启用失败", nID);
  298. return;
  299. }
  300. /* 更新表格中的状态 */
  301. m_model->setData(m_model->index(index.row(), 1), "启用");
  302. }
  303. }
  304. /* 禁用对比项 */
  305. void CompareItemListDialog::do_pBtn_disable_Clicked()
  306. {
  307. /* 获取当前选中的行 */
  308. QModelIndexList selectedRows = ui->tableView->selectionModel()->selectedRows();
  309. if(selectedRows.isEmpty())
  310. {
  311. TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择要修改的对比项", GInfo.getTopWindow());
  312. return;
  313. }
  314. for(auto& index : selectedRows)
  315. {
  316. /* 获取对比项ID */
  317. int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
  318. /* 查找对比项信息 */
  319. CompareItemInfo_t ciInfo = CIData.findCompareItemByID(nID);
  320. if(ciInfo.nID < 0)
  321. {
  322. TipWidget::display(TipWidget::OPERATOR_WARN, "对比项不存在,无法禁用", GInfo.getTopWindow());
  323. SPDLOG_LOGGER_WARN(m_logger, "对比项ID {} 不存在,无法禁用", nID);
  324. return;
  325. }
  326. /* 判断是否已经启用 */
  327. if(!ciInfo.isEnable)
  328. {
  329. // TipWidget::display(TipWidget::OPERATOR_OK, "对比项已经处于禁用状态", GInfo.getTopWindow());
  330. return;
  331. }
  332. /* 修改对比项状态为启用 */
  333. ciInfo.isEnable = false;
  334. if(!CIData.modifyCompareItem(ciInfo))
  335. {
  336. TipWidget::display(TipWidget::OPERATOR_WARN, "对比项禁用失败,请稍后重试", GInfo.getTopWindow());
  337. SPDLOG_LOGGER_ERROR(m_logger, "对比项ID {} 禁用失败", nID);
  338. return;
  339. }
  340. /* 更新表格中的状态 */
  341. m_model->setData(m_model->index(index.row(), 1), "未启用");
  342. }
  343. }
  344. /* 显示详情 */
  345. void CompareItemListDialog::do_tableView_doubleClicked(const QModelIndex &index)
  346. {
  347. /* 判断是不是第4列 */
  348. if(index.column() != 4)
  349. {
  350. /* 如果不是第4列,直接返回 */
  351. return;
  352. }
  353. /* 获取对比项ID */
  354. int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
  355. /* 查找对比项信息 */
  356. CompareItemInfo_t ciInfo = CIData.findCompareItemByID(nID);
  357. if(ciInfo.nID < 0)
  358. {
  359. TipWidget::display(TipWidget::OPERATOR_WARN, "对比项不存在,无法查看详情", GInfo.getTopWindow());
  360. SPDLOG_LOGGER_WARN(m_logger, "对比项ID {} 不存在,无法查看详情", nID);
  361. return;
  362. }
  363. /* 打开弹窗 */
  364. CompareItemDetailWidget* detailWidget = new CompareItemDetailWidget(GInfo.getTopWindow());
  365. /* 设置对比项信息 */
  366. detailWidget->setCompareItemInfo(ciInfo);
  367. detailWidget->exec();
  368. }
  369. /* 表格点击了一行 */
  370. void CompareItemListDialog::do_tableView_clicked(const QModelIndex &index)
  371. {
  372. if(index.column() == 4)
  373. {
  374. /* 打开对比项详情弹窗 */
  375. do_tableView_doubleClicked(index);
  376. return;
  377. }
  378. // int row = index.row();
  379. // /* 修改第一列状态 */
  380. // bool currentState = m_model->data(m_model->index(row, 0), Qt::CheckStateRole).toBool();
  381. // bool nextState = !currentState;
  382. // m_model->setData(m_model->index(row, 0), nextState, Qt::CheckStateRole);
  383. }
  384. /* 修改了选择行的状态 */
  385. void CompareItemListDialog::do_selectChanged(const QItemSelection &selected, const QItemSelection &deselected)
  386. {
  387. /* 这里获取的是选中的所有单元格数目 */
  388. QModelIndexList selectedRows = selected.indexes();
  389. QModelIndexList deselectedRows = deselected.indexes();
  390. if(selectedRows.isEmpty() && deselectedRows.isEmpty())
  391. {
  392. /* 如果没有选中行,直接返回 */
  393. return;
  394. }
  395. /* 更新第一列的状态 */
  396. for(const QModelIndex& index : selectedRows)
  397. {
  398. // bool currentState = m_model->data(m_model->index(index.row(), 0), Qt::CheckStateRole).toBool();
  399. m_model->setData(m_model->index(index.row(), 0), Qt::Checked, Qt::CheckStateRole);
  400. }
  401. /* 如果有取消选择的行,更新第一列状态 */
  402. for(const QModelIndex& index : deselectedRows)
  403. {
  404. // bool currentState = m_model->data(m_model->index(index.row(), 0), Qt::CheckStateRole).toBool();
  405. m_model->setData(m_model->index(index.row(), 0), Qt::Unchecked, Qt::CheckStateRole);
  406. }
  407. /* 更新标题栏选中的状态,下面获取的才是真正的选中的行 */
  408. int selectedCount = ui->tableView->selectionModel()->selectedRows().size();
  409. Qt::CheckState headerState = Qt::Unchecked;
  410. if(selectedCount == m_model->rowCount())
  411. {
  412. headerState = Qt::CheckState::Checked;
  413. }else if(selectedCount == 0)
  414. {
  415. headerState = Qt::CheckState::Unchecked;
  416. }else {
  417. headerState = Qt::CheckState::PartiallyChecked;
  418. }
  419. // SPDLOG_LOGGER_INFO(m_logger, "选中行数: {}, 总行数: {}, 标题状态: {}", selectedCount, m_model->rowCount(), static_cast<int>(headerState));
  420. /* 如果选中的行数等于总行数,说明全部选中 */
  421. auto header = qobject_cast<BaseHeader*>(ui->tableView->horizontalHeader());
  422. if(header)
  423. {
  424. header->SetChecked(headerState);
  425. }
  426. }
  427. /* 点击了标题栏选择框 */
  428. void CompareItemListDialog::do_headerSelect_clicked(bool state)
  429. {
  430. auto header = qobject_cast<BaseHeader*>(ui->tableView->horizontalHeader());
  431. if(header == nullptr)
  432. {
  433. return;
  434. }
  435. if(state)
  436. {
  437. for(int i = 0; i < m_model->rowCount(); ++i)
  438. {
  439. /* 设置第一列为选中状态 */
  440. m_model->setData(m_model->index(i, 0), Qt::Checked, Qt::CheckStateRole);
  441. ui->tableView->selectionModel()->select(m_model->index(i, 0), QItemSelectionModel::Select | QItemSelectionModel::Rows);
  442. }
  443. }else
  444. {
  445. for(int i = 0; i < m_model->rowCount(); ++i)
  446. {
  447. /* 设置第一列为未选中状态 */
  448. m_model->setData(m_model->index(i, 0), Qt::Unchecked, Qt::CheckStateRole);
  449. ui->tableView->selectionModel()->select(m_model->index(i, 0), QItemSelectionModel::Deselect | QItemSelectionModel::Rows);
  450. }
  451. }
  452. }
  453. /* 初始化表格 */
  454. void CompareItemListDialog::initTable()
  455. {
  456. /* 初始化视图模型 */
  457. m_model = new QStandardItemModel(this);
  458. m_model->setColumnCount(5);
  459. /* 设置每一列的标题 */
  460. m_model->setHeaderData(0, Qt::Horizontal, "序号");
  461. m_model->setHeaderData(1, Qt::Horizontal, "状态");
  462. m_model->setHeaderData(2, Qt::Horizontal, "对比项");
  463. m_model->setHeaderData(3, Qt::Horizontal, "通道数");
  464. m_model->setHeaderData(4, Qt::Horizontal, "操作");
  465. // m_model->clear();
  466. // m_sortModel = new CSortModel(this);
  467. // m_sortModel->setSourceModel(m_model);
  468. // m_sortModel->sort(0, Qt::AscendingOrder); /* 默认升序 */
  469. /* 设置排序数据 */
  470. // m_sortModel->setSortRole(QtUserRole::UserRole_Time); /* 设置排序角色 */
  471. ui->tableView->setModel(m_model);
  472. /* 设置标题头部代理 */
  473. auto oneHeader = new BaseHeader(ui->tableView);
  474. oneHeader->SetCheckable(true);
  475. ui->tableView->setHorizontalHeader(oneHeader);
  476. /* 设置选择属性 */
  477. ui->tableView->setSelectionMode(QAbstractItemView::ExtendedSelection); /* 可多选 */
  478. ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
  479. /* 设置第一列代理 */
  480. auto checkBoxDelegate = new DelegateCheckBox(ui->tableView);
  481. /* 设置多种选择状态 */
  482. ui->tableView->setItemDelegateForColumn(0, checkBoxDelegate);
  483. /*--------------------------- 设置横向标题 -------------------------------*/
  484. /* 设置横向标题可见 */
  485. ui->tableView->horizontalHeader()->setVisible(true);
  486. /* 设置标题左对齐 */
  487. ui->tableView->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
  488. /* 设置横向标题可点击 */
  489. ui->tableView->horizontalHeader()->setSectionsClickable(true);
  490. /*--------------------------- 设置列 -------------------------------*/
  491. /* 设置每列的高度 */
  492. ui->tableView->verticalHeader()->setDefaultSectionSize(48);
  493. /* 设置横向表头高度为48像素(可根据需要调整) */
  494. ui->tableView->horizontalHeader()->setFixedHeight(48);
  495. /* 设置列宽度固定 */
  496. ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
  497. /* 去掉列标题 */
  498. ui->tableView->verticalHeader()->setVisible(false);
  499. /* 去掉网格线 */
  500. ui->tableView->setShowGrid(false);
  501. /* 设置单元格不可编辑 */
  502. ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
  503. /* 禁止显示横向滚动条 */
  504. // ui->tableView->horizontalHeader()->setStretchLastSection(true); /* 设置最后一列拉伸 */
  505. /* 设置固定列宽度 */
  506. ui->tableView->setColumnWidth(0, 160); /* 第一列宽度 */
  507. ui->tableView->setColumnWidth(1, 160); /* 第二列宽度 */
  508. ui->tableView->setColumnWidth(2, 240); /* 第三列宽度 */
  509. ui->tableView->setColumnWidth(3, 280); /* 第四列宽度 */
  510. ui->tableView->setColumnWidth(4, 96); /* 第五列宽度 */
  511. /* 连接点击信号 */
  512. // connect(ui->tableView, &QTableView::doubleClicked, this, &CompareItemListDialog::do_tableView_doubleClicked);
  513. connect(ui->tableView, &QTableView::clicked, this, &CompareItemListDialog::do_tableView_clicked);
  514. connect(ui->tableView->selectionModel(), &QItemSelectionModel::selectionChanged,
  515. this, &CompareItemListDialog::do_selectChanged);
  516. connect(oneHeader, &BaseHeader::sig_Checked, this, &CompareItemListDialog::do_headerSelect_clicked);
  517. /* 测试用,加入两列数据 */
  518. // for(int i = 0; i < 10; ++i)
  519. // {
  520. // CompareItemTableItem_t item;
  521. // item.nSerialNum = i + 1; /* 序号 */
  522. // item.nID = i + 1000; /* 对比项ID */
  523. // item.strName = QString("对比项%1").arg(i + 1); /* 对比项名称 */
  524. // item.isEnable = (i % 2 == 0); /* 偶数启用,奇数未启用 */
  525. // item.nChannelCount = i + 1; /* 通道数 */
  526. // addRow(item);
  527. // }
  528. }
  529. /* 添加一行 */
  530. void CompareItemListDialog::addRow(CompareItemTableItem_t tableItem)
  531. {
  532. QList<QStandardItem*> items;
  533. /* -------------------- 序号 -------------------- */
  534. QStandardItem* item0 = new QStandardItem(QString::number(tableItem.nSerialNum));
  535. item0->setCheckable(true);
  536. item0->setCheckState(Qt::Unchecked);
  537. items.append(item0);
  538. /* 保存这个对比项的ID */
  539. item0->setData(tableItem.nID, m_userRole_CompareItemID);
  540. /* -------------------- 状态 -------------------- */
  541. QString status = tableItem.isEnable ? "启用" : "未启用";
  542. items.append(new QStandardItem(status));
  543. /* -------------------- 对比项 -------------------- */
  544. items.append(new QStandardItem(tableItem.strName));
  545. /* -------------------- 通道数 -------------------- */
  546. items.append(new QStandardItem(QString::number(tableItem.nChannelCount)));
  547. /* -------------------- 详情 -------------------- */
  548. QStandardItem* item4 = new QStandardItem("详情");
  549. /* 这个字体设置为蓝色 */
  550. item4->setForeground(QBrush("#438EFF"));
  551. items.append(item4);
  552. m_model->appendRow(items);
  553. }