settingnum.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. #include "settingnum.h"
  2. #include "spdlog.h"
  3. #include "ui_settingnum.h"
  4. #include <QDebug>
  5. #include <QFile>
  6. #include <QPainter>
  7. #include "customcombobox.h"
  8. #include "onesettingitem.h"
  9. #include "oneshadow.h"
  10. #include "ListItem.h"
  11. #include "TipWidget.h"
  12. SettingNum::SettingNum(QDialog *parent) :
  13. QDialog(parent),
  14. ui(new Ui::SettingNum)
  15. {
  16. ui->setupUi(this);
  17. m_logger = spdlog::get("EyeMap");
  18. if(m_logger == nullptr)
  19. {
  20. qDebug() << "获取 EyeMap logger 失败";
  21. return;
  22. }
  23. /* 注册事件过滤,主要是消除滚轮对comboBox的影响 */
  24. ui->comboBox_rowNum->installEventFilter(this);
  25. ui->comboBox_columnNum->installEventFilter(this);
  26. /* 设置无边框和背景透明 */
  27. this->setWindowFlags(Qt::FramelessWindowHint);
  28. this->setAttribute(Qt::WA_TranslucentBackground);
  29. ui->label_warn->hide();
  30. /* 加载QSS */
  31. QFile fileQss(":/qss/SettingNum/SettingNum.qss");
  32. if(fileQss.open(QFile::ReadOnly))
  33. {
  34. QString qss = fileQss.readAll();
  35. this->setStyleSheet(qss);
  36. fileQss.close();
  37. } else
  38. {
  39. SPDLOG_LOGGER_ERROR(m_logger, "加载QSS文件失败");
  40. }
  41. /* 设置QListWidget拖拽 */
  42. ui->listWidget->setDragDropMode(QAbstractItemView::InternalMove);
  43. ui->listWidget->setDragEnabled(true);
  44. ui->listWidget->setDropIndicatorShown(true);
  45. ui->listWidget->setAcceptDrops(true);
  46. ui->listWidget->setSelectionMode(QAbstractItemView::SingleSelection);
  47. /* 注册事件过滤器,拦截拖拽事件 */
  48. // ui->listWidget->installEventFilter(this);
  49. /* 初始化变量 */
  50. for(auto& item : m_listItem)
  51. {
  52. item = nullptr;
  53. }
  54. // ui->pBtn_close->move(ui->widget_top->width() - 40, 13);
  55. /* 设置下拉框可选个数 */
  56. QStringList listRow;
  57. listRow << "1" << "2" << "3" << "4";
  58. ui->comboBox_rowNum->addItems(listRow);
  59. ui->comboBox_columnNum->addItem("1");
  60. ui->comboBox_columnNum->addItem("2");
  61. ui->comboBox_rowNum->setCurrentIndex(1);
  62. ui->comboBox_columnNum->setCurrentIndex(1);
  63. connect(ui->pBtn_close, &QPushButton::clicked, this, &SettingNum::do_pBtn_close);
  64. connect(ui->pBtn_ok, &QPushButton::clicked, this, &SettingNum::do_pBtn_ok);
  65. connect(ui->pBtn_cancel, &QPushButton::clicked, this, &SettingNum::do_pBtn_cancel);
  66. connect(ui->comboBox_rowNum, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &SettingNum::do_selectRowAndColumn);
  67. connect(ui->comboBox_columnNum, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &SettingNum::do_selectRowAndColumn);
  68. connect(this, &SettingNum::signal_exec, this, &SettingNum::do_layoutItem);
  69. connect(ui->listWidget, &ListItem::signal_dropComplete, this, &SettingNum::do_setItemNum);
  70. }
  71. SettingNum::~SettingNum()
  72. {
  73. for(auto item : m_listItem)
  74. {
  75. if(item == nullptr)
  76. {
  77. continue;
  78. }
  79. delete item;
  80. item = nullptr;
  81. }
  82. delete ui;
  83. }
  84. /* 设置行数和列数 */
  85. void SettingNum::setRowAndColumn(int row, int column)
  86. {
  87. ui->comboBox_rowNum->setCurrentIndex(row - 1);
  88. ui->comboBox_columnNum->setCurrentIndex(column - 1);
  89. /* 根据 行 x 列 总数计算需要显示的个数 */
  90. m_row = row;
  91. m_column = column;
  92. int num = row * column;
  93. ui->listWidget->clear();
  94. m_listItem.clear();
  95. for(int i = 1; i <= num; i++)
  96. {
  97. OneSettingItem *item = new OneSettingItem(ui->listWidget);
  98. item->setNum(i);
  99. connect(item, &OneSettingItem::signal_select_channel, this, &SettingNum::do_selectChannel);
  100. m_listItem.append(item);
  101. /* 创建QListWidget的项和项高度,根据编号是否显示,放置到ListWidget中 */
  102. QListWidgetItem *listWidgetItem = new QListWidgetItem(ui->listWidget);
  103. listWidgetItem->setSizeHint(QSize(0, 48));
  104. ui->listWidget->setItemWidget(listWidgetItem, item);
  105. }
  106. /* 移动item的位置 */
  107. // layoutItem(num);
  108. }
  109. /* 设置每个项的信息 */
  110. void SettingNum::setEveryEyeMapInfo(const QList<OneEyeMapInfo> &listInfo)
  111. {
  112. for(auto &item : m_listItem)
  113. {
  114. for(auto &info : listInfo)
  115. {
  116. if(item->getNum() == info.num)
  117. {
  118. // SPDLOG_LOGGER_DEBUG(m_logger, "序号:{}, 设置项信息: {}", info.num, info.channelInfo.channelName.toStdString());
  119. item->setItemInfo(info);
  120. break;
  121. }
  122. }
  123. }
  124. }
  125. /* 设置可用的通道信息 */
  126. void SettingNum::setChannelList(const QList<OneChannelInfo> &listChannelInfo)
  127. {
  128. for(auto &item : m_listItem)
  129. {
  130. item->setChannelList(listChannelInfo);
  131. }
  132. m_listChannelInfo = listChannelInfo;
  133. }
  134. /* 刷新布局 */
  135. void SettingNum::refreshLayout()
  136. {
  137. layoutItem(m_row * m_column);
  138. }
  139. /* 事件过滤器 */
  140. bool SettingNum::eventFilter(QObject *watched, QEvent *event)
  141. {
  142. if(watched == ui->comboBox_rowNum || watched == ui->comboBox_columnNum)
  143. {
  144. if(event->type() == QEvent::Wheel)
  145. {
  146. return true;
  147. }
  148. }
  149. return QWidget::eventFilter(watched, event);
  150. }
  151. /* 显示事件 */
  152. void SettingNum::showEvent(QShowEvent *event)
  153. {
  154. QDialog::showEvent(event);
  155. /* 在这个页面显示出来后再设置一次项隐藏才可以 */
  156. emit signal_exec();
  157. }
  158. /* 鼠标点击事件 */
  159. void SettingNum::mousePressEvent(QMouseEvent *event)
  160. {
  161. m_lastPos = event->globalPos();
  162. event->accept();
  163. }
  164. /* 鼠标移动事件 */
  165. void SettingNum::mouseMoveEvent(QMouseEvent *event)
  166. {
  167. auto point = ui->widget_top->mapToGlobal(QPoint(0, 0));
  168. QRect rect(point, ui->widget_top->size());
  169. if(!rect.contains(m_lastPos))
  170. {
  171. event->accept();
  172. return;
  173. }
  174. int dx = event->globalX() - m_lastPos.x();
  175. int dy = event->globalY() - m_lastPos.y();
  176. this->move(this->x() + dx, this->y() + dy);
  177. m_lastPos = event->globalPos();
  178. event->accept();
  179. }
  180. /* 鼠标释放事件 */
  181. void SettingNum::mouseReleaseEvent(QMouseEvent *event)
  182. {
  183. event->accept();
  184. }
  185. /* 关闭按钮槽函数 */
  186. void SettingNum::do_pBtn_close()
  187. {
  188. this->close();
  189. }
  190. /* 点击了OK按钮 */
  191. void SettingNum::do_pBtn_ok()
  192. {
  193. /* 取消所有的报警 */
  194. for(auto& it : m_listItem)
  195. {
  196. it->setChannelNameAlarm(false);
  197. it->setChannelSelectAlarm(false);
  198. }
  199. ui->label_warn->hide();
  200. /* 检查通道选择 */
  201. bool isExit = false;
  202. for(auto& it : m_listItem)
  203. {
  204. if(it->getCurrentChannel().channel == OscChnNum::Osc_None)
  205. {
  206. // ui->label_warn->setText("请选择示波器通道");
  207. // ui->label_warn->show();
  208. TipWidget::display(TipWidget::OPERATOR_FAIL, "请选择示波器通道", m_parent);
  209. it->setChannelSelectAlarm(true);
  210. isExit = true;
  211. }
  212. }
  213. if(isExit)
  214. {
  215. return;
  216. }
  217. /* 检查自定义的通道名称是否存在,名字是否冲突 */
  218. for(int i = 0; i < m_listItem.size(); i++)
  219. {
  220. /* 判断通道名称是否为空 */
  221. if(m_listItem.at(i)->getEyeMapInfo().title.isEmpty())
  222. {
  223. m_listItem.at(i)->setChannelNameAlarm(true);
  224. // ui->label_warn->setText("通道名称不能为空!");
  225. // ui->label_warn->show();
  226. TipWidget::display(TipWidget::OPERATOR_FAIL, "通道名称不能为空", m_parent);
  227. return;
  228. }
  229. for(int j = i + 1; j < m_listItem.size(); j++)
  230. {
  231. /* 判断通道名称是否重复 */
  232. if(m_listItem.at(i)->getEyeMapInfo().title == m_listItem.at(j)->getEyeMapInfo().title)
  233. {
  234. m_listItem.at(i)->setChannelNameAlarm(true);
  235. m_listItem.at(j)->setChannelNameAlarm(true);
  236. // ui->label_warn->setText("通道名称不能重复!");
  237. // ui->label_warn->show();
  238. TipWidget::display(TipWidget::OPERATOR_FAIL, "通道名称不能重复", m_parent);
  239. return;
  240. }
  241. }
  242. }
  243. isOk = true;
  244. m_row = ui->comboBox_rowNum->currentText().toInt();
  245. m_column = ui->comboBox_columnNum->currentText().toInt();
  246. /* 先将所有的眼图模块的序号设置为0 */
  247. GEyeMapInfo.clearAllNum();
  248. /* 更新全局信息 */
  249. for(auto &item : m_listItem)
  250. {
  251. // SPDLOG_LOGGER_DEBUG(m_logger, "序号: {}, 通道号: {}", item->getNum(), item->getCurrentChannel().channelName.toStdString());
  252. GEyeMapInfo.updateSettingNum(item->getEyeMapInfo());
  253. }
  254. this->close();
  255. }
  256. /* 点击了取消按钮 */
  257. void SettingNum::do_pBtn_cancel()
  258. {
  259. isOk = false;
  260. this->close();
  261. }
  262. /* 选择行和列槽函数 */
  263. void SettingNum::do_selectRowAndColumn(int index)
  264. {
  265. // SPDLOG_LOGGER_DEBUG(m_logger, "选择了行和列");
  266. m_row = ui->comboBox_rowNum->currentText().toInt();
  267. m_column = ui->comboBox_columnNum->currentText().toInt();
  268. int num = m_row * m_column;
  269. // layoutItem(num);
  270. showOrHide(num);
  271. }
  272. /* 通道选择槽函数,选择了一个通道,取消其他项可能已经选择的相同通道 */
  273. void SettingNum::do_selectChannel(const OscChnNum channel, const QString &channelName)
  274. {
  275. auto sender = qobject_cast<OneSettingItem*>(QObject::sender());
  276. for(auto item : m_listItem)
  277. {
  278. if((item->getCurrentChannel().channel == channel) && (item != sender))
  279. {
  280. // item->setCurrentChannel(GEyeMapInfo.getChannelName(OscChnNum::Osc_None));
  281. item->setCurrentChannel(OscChnNum::Osc_None);
  282. }
  283. }
  284. }
  285. /* 刷新listWidget */
  286. void SettingNum::do_layoutItem()
  287. {
  288. layoutItem(m_row * m_column);
  289. }
  290. /* 重新设置序号并刷新显示 */
  291. void SettingNum::do_setItemNum()
  292. {
  293. // SPDLOG_LOGGER_DEBUG(m_logger, "重新设置序号");
  294. resetItemNum();
  295. /* 打印listWidget和序号 */
  296. for(int i = 0; i < ui->listWidget->count(); i++)
  297. {
  298. auto item = qobject_cast<OneSettingItem*>(ui->listWidget->itemWidget(ui->listWidget->item(i)));
  299. SPDLOG_LOGGER_DEBUG(m_logger, "序号: {}, 通道: {}", item->getNum(), item->getCurrentChannel().channelName.toStdString());
  300. }
  301. }
  302. /**
  303. * @brief 布局item
  304. *
  305. * @param num 需要显示的几个item
  306. */
  307. void SettingNum::layoutItem(int num)
  308. {
  309. for(auto item : m_listItem)
  310. {
  311. // auto dy = (item->getNum() - 1) * 48;
  312. // item->move(0, dy);
  313. if(item->getNum() > num)
  314. {
  315. item->hide();
  316. } else
  317. {
  318. item->show();
  319. }
  320. }
  321. }
  322. /* 重新设置Item序号 */
  323. void SettingNum::resetItemNum()
  324. {
  325. for(int i = 0; i < ui->listWidget->count(); i++)
  326. {
  327. auto item = qobject_cast<OneSettingItem*>(ui->listWidget->itemWidget(ui->listWidget->item(i)));
  328. item->setNum(i + 1);
  329. }
  330. }
  331. /* 显示或隐藏选项 */
  332. void SettingNum::showOrHide(int num)
  333. {
  334. if(num > m_listItem.size())
  335. {
  336. for(int i = m_listItem.size(); i < num; i++)
  337. {
  338. OneSettingItem *item = new OneSettingItem(ui->listWidget);
  339. item->setNum(i + 1);
  340. /* 设置可选通道列表 */
  341. item->setChannelList(m_listChannelInfo);
  342. /* 设置默认选项 */
  343. item->setItemInfo(GEyeMapInfo.getOneEyeMapInfo(i + 1));
  344. connect(item, &OneSettingItem::signal_select_channel, this, &SettingNum::do_selectChannel);
  345. m_listItem.append(item);
  346. /* 创建QListWidget的项和项高度 */
  347. QListWidgetItem *listWidgetItem = new QListWidgetItem(ui->listWidget);
  348. listWidgetItem->setSizeHint(QSize(0, 48));
  349. ui->listWidget->setItemWidget(listWidgetItem, item);
  350. }
  351. } else
  352. {
  353. for(int i = m_listItem.size() - 1; i >= num; i--)
  354. {
  355. ui->listWidget->takeItem(i);
  356. for(auto& it : m_listItem)
  357. {
  358. if(it->getNum() == i + 1)
  359. {
  360. auto widget = it;
  361. m_listItem.removeOne(it);
  362. delete widget;
  363. break;
  364. }
  365. }
  366. }
  367. }
  368. }