ExecPlanItem.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. #include "ExecPlanItem.h"
  2. #include <QDebug>
  3. #include <QEvent>
  4. #include <QMouseEvent>
  5. #include <QListView>
  6. #include <QVariant>
  7. ExecPlanItem::ExecPlanItem(int weekDay, QWidget *parent) : QWidget(parent), m_weekDay(weekDay)
  8. {
  9. this->setMinimumHeight(48);
  10. if(m_weekDay < 7)
  11. {
  12. m_dateType = DateType::NormalDate;
  13. } else
  14. {
  15. m_dateType = DateType::SpecialDate;
  16. }
  17. m_logger = spdlog::get("ExecPlan");
  18. if(nullptr == m_logger)
  19. {
  20. qDebug() << "ExecPlan获取logger失败";
  21. }
  22. /* 变量初始化 */
  23. m_date.setDate(0,0,0);
  24. m_execTime.setHMS(0,0,0);
  25. m_devName.clear();
  26. m_actionName.clear();
  27. /* UI图标初始化 */
  28. m_labelWarning = new QLabel(this);
  29. m_warnTimer = new QTimer(this);
  30. m_labelNum = new QLabel(this);
  31. m_labelDate = new QLabel(this);
  32. m_labelExecTime = new QLabel(this);
  33. m_delete = new QLabel(this);
  34. m_labelDateIcon = new QLabel(this);
  35. m_labelTimeIcon = new QLabel(this);
  36. m_comBoxDev = new CustomComboBox(this);
  37. m_comBoxAction = new CustomComboBox(this);
  38. /* 设置大小和布局 */
  39. int w = m_dateType == DateType::NormalDate ? 828 : 976;
  40. resize(w,48);
  41. m_labelNum->resize(80,32);
  42. m_comBoxDev->resize(260,32);
  43. m_labelDate->resize(132,32);
  44. m_labelDateIcon->resize(16,16);
  45. m_labelDate->setText("2024-4-22");
  46. m_comBoxAction->resize(260,32);
  47. m_labelExecTime->resize(132,32);
  48. m_labelExecTime->setText("00:00:00");
  49. m_labelTimeIcon->resize(16,16);
  50. m_delete->resize(32,32);
  51. /* 警告label */
  52. m_labelWarning->resize(300,16);
  53. m_labelWarning->move(96,0);
  54. /* 根据是否是特殊日布局 */
  55. if(m_dateType == DateType::NormalDate)
  56. {
  57. m_labelDate->hide();
  58. m_labelDateIcon->hide();
  59. m_labelNum->move(0,16);
  60. m_comBoxDev->move(96,16);
  61. m_labelExecTime->move(372,16);
  62. m_labelTimeIcon->move(480,24);
  63. m_comBoxAction->move(520,16);
  64. m_delete->move(796,16);
  65. }else
  66. {
  67. m_labelNum->move(0,16);
  68. m_comBoxDev->move(96,16);
  69. m_labelDate->move(372,16);
  70. m_labelDateIcon->move(480,24);
  71. m_labelExecTime->move(520,16);
  72. m_labelTimeIcon->move(628,24);
  73. m_comBoxAction->move(668,16);
  74. m_delete->move(944,16);
  75. }
  76. /* 设置样式表 */
  77. m_labelNum->setObjectName("Num");
  78. m_labelDate->setObjectName("Date");
  79. m_labelDateIcon->setObjectName("DateIcon");
  80. m_labelExecTime->setObjectName("ExecTime");
  81. m_labelTimeIcon->setObjectName("TimeIcon");
  82. m_delete->setObjectName("Delete");
  83. m_labelWarning->setObjectName("Warning");
  84. m_comBoxDev->setObjectName("Dev");
  85. m_comBoxAction->setObjectName("Action");
  86. /* 加载QSS */
  87. QFile file(":/qss/qss/PageExecPlan/ExecPlanItem.qss");
  88. if(file.open(QFile::ReadOnly))
  89. {
  90. QString styleSheet = file.readAll();
  91. this->setStyleSheet(styleSheet);
  92. file.close();
  93. }else
  94. {
  95. SPDLOG_LOGGER_ERROR(m_logger,"打开QSS文件失败");
  96. }
  97. /* 设置comboBox下拉框阴影 */
  98. m_comBoxDev->setViewShadowEffect();
  99. m_comBoxAction->setViewShadowEffect();
  100. /* 警告定时器设置 */
  101. m_warnTimer->setInterval(5000);
  102. m_warnTimer->setSingleShot(true);
  103. connect(m_warnTimer,&QTimer::timeout,this,[this](){
  104. m_labelWarning->hide();
  105. });
  106. /* 将时间和日期图标设置到底层,不影响点击 */
  107. m_labelDateIcon->lower();
  108. m_labelTimeIcon->lower();
  109. /* 注册事件过滤 */
  110. m_delete->installEventFilter(this);
  111. m_labelDate->installEventFilter(this);
  112. m_labelExecTime->installEventFilter(this);
  113. m_comBoxDev->installEventFilter(this);
  114. m_comBoxAction->installEventFilter(this);
  115. /* 连接信号和槽 */
  116. connect(m_comBoxDev,QOverload<const QString&>::of(&QComboBox::textActivated),this, &ExecPlanItem::do_devChanged);
  117. connect(m_comBoxAction,QOverload<const QString&>::of(&QComboBox::currentTextChanged),this,&ExecPlanItem::do_actionChanged);
  118. }
  119. /* 删除前,取消所有关联的信号和槽 */
  120. ExecPlanItem::~ExecPlanItem()
  121. {
  122. disconnect(this);
  123. }
  124. /* 设置序号 */
  125. void ExecPlanItem::setNum(int num)
  126. {
  127. m_num = num;
  128. m_labelNum->setText(QString::asprintf("%d",num));
  129. }
  130. /* 获取序号 */
  131. int ExecPlanItem::getNum()
  132. {
  133. return m_num;
  134. }
  135. /* 设置日期 */
  136. void ExecPlanItem::setDate(const QDate &date)
  137. {
  138. m_date = date;
  139. m_labelDate->setText(m_date.toString("yyyy-MM-dd"));
  140. }
  141. /* 获取日期 */
  142. QDate ExecPlanItem::getDate()
  143. {
  144. return m_date;
  145. }
  146. /* 设置开始时间 */
  147. void ExecPlanItem::setExecTime(const QTime &time)
  148. {
  149. m_execTime = time;
  150. m_labelExecTime->setText(m_execTime.toString());
  151. }
  152. /* 获取开始时间 */
  153. QTime ExecPlanItem::getExecTime() const
  154. {
  155. return m_execTime;
  156. }
  157. /**
  158. * @brief 设置警告
  159. * @param str 警告的内容
  160. * @param ms 如果设置成0,将不启动定时器,一直显示警告内容
  161. */
  162. void ExecPlanItem::setWarningText(QString str,int ms)
  163. {
  164. m_labelWarning->setText(str);
  165. m_labelWarning->show();
  166. if(ms > 0)
  167. {
  168. m_warnTimer->start(ms);
  169. }
  170. }
  171. /* 设置设备名称 */
  172. void ExecPlanItem::setDevName(const QString &dev)
  173. {
  174. m_devName = dev;
  175. /* 寻找指向这个名称的设备信息 */
  176. // m_cfgDev = DevInfo.cfgDevInfo().value(dev);
  177. m_cfgDev = DevInfo.findCfgDev(dev);
  178. /* 先屏蔽信号,防止添加项的过程中,乱发信号 */
  179. QSignalBlocker bl(m_comBoxDev);
  180. m_comBoxDev->clear();
  181. for(const auto& it : DevInfo.cfgDevInfo())
  182. {
  183. m_comBoxDev->addItem(it->devName);
  184. }
  185. m_comBoxDev->setCurrentText(m_devName);
  186. /* 设置相应的动作 */
  187. setActionName();
  188. // SPDLOG_LOGGER_INFO(m_logger,"m_devName:{},当前项是:{}",m_devName.toStdString(),m_comBoxDev->currentText().toStdString());
  189. }
  190. /* 获取设备名称 */
  191. QString ExecPlanItem::getDevName() const
  192. {
  193. return m_devName;
  194. }
  195. /* 只修改设备名称,不修改设备类型,用于修改了设备名称,同步过来更新 */
  196. void ExecPlanItem::changeDevName(const QString &name)
  197. {
  198. if(m_cfgDev->devName == name)
  199. {
  200. m_devName = name;
  201. m_comBoxDev->setCurrentText(name);
  202. }else
  203. {
  204. SPDLOG_LOGGER_WARN(m_logger,"修改后的设备名称和配置文件中不同:{}",name.toStdString());
  205. }
  206. }
  207. /**
  208. * @brief 根据选择的设备设置相应的动作选项
  209. * @param action
  210. */
  211. void ExecPlanItem::setActionName(const QString &action)
  212. {
  213. m_actionName = action;
  214. m_comBoxAction->clear();
  215. /* 获取这个设备 */
  216. auto it = DevInfo.cfgDevInfo().value(m_comBoxDev->currentText(),nullptr);
  217. if(nullptr != it)
  218. {
  219. for(auto it1 = it->DevType.getDevAction().begin(); it1 != it->DevType.getDevAction().end(); it1++)
  220. {
  221. m_comBoxAction->addItem(it1.value(), static_cast<int>(it1.key()));
  222. }
  223. }
  224. // SPDLOG_LOGGER_DEBUG(m_logger,"当前Action:{}",m_action.toStdString());
  225. m_comBoxAction->setCurrentText(action);
  226. m_actionID = m_comBoxAction->currentData().toInt();
  227. }
  228. /* 通过动作类型设置动作 */
  229. void ExecPlanItem::setActionNum(int action)
  230. {
  231. }
  232. /* 设置动作,只设置可选择的动作类型 */
  233. void ExecPlanItem::setActionName()
  234. {
  235. QString curAction = m_comBoxAction->currentText();
  236. m_comBoxAction->clear();
  237. auto it = DevInfo.cfgDevInfo().value(m_comBoxDev->currentText(),nullptr);
  238. if(nullptr != it)
  239. {
  240. for(auto it1 = it->DevType.getDevAction().begin();it1 != it->DevType.getDevAction().end();it1++)
  241. {
  242. m_comBoxAction->addItem(it1.value(), static_cast<int>(it1.key()));
  243. }
  244. }
  245. m_comBoxAction->setCurrentText(curAction);
  246. }
  247. /* 获取动作 */
  248. QString ExecPlanItem::getActionName()
  249. {
  250. return m_actionName;
  251. }
  252. /* 获取动作类型 */
  253. int ExecPlanItem::getActionNum()
  254. {
  255. return m_actionID;
  256. }
  257. /* 获取日期类型 */
  258. DateType ExecPlanItem::getDateType()
  259. {
  260. return m_dateType;
  261. }
  262. /* 隐藏警告 */
  263. void ExecPlanItem::hideWarn()
  264. {
  265. m_labelWarning->hide();
  266. }
  267. /* 获取设备信息 */
  268. ConfigurationDevInfo *ExecPlanItem::getCfgDev()
  269. {
  270. return m_cfgDev;
  271. }
  272. /* 设备改变了,动作选项也跟着改变 */
  273. void ExecPlanItem::do_devChanged(QString devName)
  274. {
  275. SPDLOG_LOGGER_DEBUG(m_logger,"更改Action,devName:{}",devName.toStdString());
  276. /* 根据选择的设备,设置该设备的动作 */
  277. m_comBoxAction->clear();
  278. auto it = DevInfo.findCfgDev(devName);
  279. // SPDLOG_LOGGER_DEBUG(m_logger,"更改Action,devName:{}, it:{}",devName.toStdString(),it->devName.toStdString());
  280. if(nullptr != it)
  281. {
  282. m_cfgDev = it;
  283. /* 将该设备支持的动作设置到选项中 */
  284. for(auto it1 = it->DevType.getDevAction().begin();it1 != it->DevType.getDevAction().end();it1++)
  285. {
  286. m_comBoxAction->addItem(it1.value(), static_cast<int>(it1.key()));
  287. }
  288. }else
  289. {
  290. SPDLOG_LOGGER_INFO(m_logger,"没有这个设备:{}",devName.toStdString());
  291. return;
  292. }
  293. m_devName = devName;
  294. emit signal_devChanged();
  295. }
  296. /* 动作改变了 */
  297. void ExecPlanItem::do_actionChanged(QString action)
  298. {
  299. m_actionName = action;
  300. m_actionID = m_comBoxAction->currentData().toInt();
  301. }
  302. /**
  303. * @brief 监测点击相关的label
  304. * @param watched
  305. * @param event
  306. * @return
  307. */
  308. bool ExecPlanItem::eventFilter(QObject *watched, QEvent *event)
  309. {
  310. /* 关闭图标 */
  311. if(watched == m_delete && event->type() == QEvent::MouseButtonPress)
  312. {
  313. auto e = static_cast<QMouseEvent *>(event);
  314. if(e->button() == Qt::LeftButton)
  315. {
  316. emit signal_OneItemDelete(m_num);
  317. return true;
  318. }
  319. }
  320. /* 点击日期 */
  321. else if(watched == m_labelDate && event->type() == QEvent::MouseButtonPress)
  322. {
  323. auto e = static_cast<QMouseEvent *>(event);
  324. if(e->button() == Qt::LeftButton)
  325. {
  326. emit signal_dateClicked(m_date);
  327. return true;
  328. }
  329. }
  330. /* 点击执行时间 */
  331. else if(watched == m_labelExecTime && event->type() == QEvent::MouseButtonPress)
  332. {
  333. auto e = static_cast<QMouseEvent *>(event);
  334. if(e->button() == Qt::LeftButton)
  335. {
  336. emit signal_execTimeClicked(m_execTime);
  337. return true;
  338. }
  339. }
  340. /* 滚轮事件 */
  341. else if(event->type() == QEvent::Wheel)
  342. {
  343. return true;
  344. }
  345. return QWidget::eventFilter(watched,event);
  346. }
  347. /* 禁用这个项中所有的滚轮时间,这个不起效果 */
  348. //void ExecPlanItem::wheelEvent(QWheelEvent *event)
  349. //{
  350. // return;
  351. //}