#include "ExecPlanItem.h" #include #include #include #include #include ExecPlanItem::ExecPlanItem(int weekDay, QWidget *parent) : QWidget(parent), m_weekDay(weekDay) { this->setMinimumHeight(48); if(m_weekDay < 7) { m_dateType = DateType::NormalDate; } else { m_dateType = DateType::SpecialDate; } m_logger = spdlog::get("ExecPlan"); if(nullptr == m_logger) { qDebug() << "ExecPlan获取logger失败"; } /* 变量初始化 */ m_date.setDate(0,0,0); m_execTime.setHMS(0,0,0); m_devName.clear(); m_actionName.clear(); /* UI图标初始化 */ m_labelWarning = new QLabel(this); m_warnTimer = new QTimer(this); m_labelNum = new QLabel(this); m_labelDate = new QLabel(this); m_labelExecTime = new QLabel(this); m_delete = new QLabel(this); m_labelDateIcon = new QLabel(this); m_labelTimeIcon = new QLabel(this); m_comBoxDev = new CustomComboBox(this); m_comBoxAction = new CustomComboBox(this); /* 设置大小和布局 */ int w = m_dateType == DateType::NormalDate ? 828 : 976; resize(w,48); m_labelNum->resize(80,32); m_comBoxDev->resize(260,32); m_labelDate->resize(132,32); m_labelDateIcon->resize(16,16); m_labelDate->setText("2024-4-22"); m_comBoxAction->resize(260,32); m_labelExecTime->resize(132,32); m_labelExecTime->setText("00:00:00"); m_labelTimeIcon->resize(16,16); m_delete->resize(32,32); /* 警告label */ m_labelWarning->resize(300,16); m_labelWarning->move(96,0); /* 根据是否是特殊日布局 */ if(m_dateType == DateType::NormalDate) { m_labelDate->hide(); m_labelDateIcon->hide(); m_labelNum->move(0,16); m_comBoxDev->move(96,16); m_labelExecTime->move(372,16); m_labelTimeIcon->move(480,24); m_comBoxAction->move(520,16); m_delete->move(796,16); }else { m_labelNum->move(0,16); m_comBoxDev->move(96,16); m_labelDate->move(372,16); m_labelDateIcon->move(480,24); m_labelExecTime->move(520,16); m_labelTimeIcon->move(628,24); m_comBoxAction->move(668,16); m_delete->move(944,16); } /* 设置样式表 */ m_labelNum->setObjectName("Num"); m_labelDate->setObjectName("Date"); m_labelDateIcon->setObjectName("DateIcon"); m_labelExecTime->setObjectName("ExecTime"); m_labelTimeIcon->setObjectName("TimeIcon"); m_delete->setObjectName("Delete"); m_labelWarning->setObjectName("Warning"); m_comBoxDev->setObjectName("Dev"); m_comBoxAction->setObjectName("Action"); /* 加载QSS */ QFile file(":/qss/qss/PageExecPlan/ExecPlanItem.qss"); if(file.open(QFile::ReadOnly)) { QString styleSheet = file.readAll(); this->setStyleSheet(styleSheet); file.close(); }else { SPDLOG_LOGGER_ERROR(m_logger,"打开QSS文件失败"); } /* 设置comboBox下拉框阴影 */ m_comBoxDev->setViewShadowEffect(); m_comBoxAction->setViewShadowEffect(); /* 警告定时器设置 */ m_warnTimer->setInterval(5000); m_warnTimer->setSingleShot(true); connect(m_warnTimer,&QTimer::timeout,this,[this](){ m_labelWarning->hide(); }); /* 将时间和日期图标设置到底层,不影响点击 */ m_labelDateIcon->lower(); m_labelTimeIcon->lower(); /* 注册事件过滤 */ m_delete->installEventFilter(this); m_labelDate->installEventFilter(this); m_labelExecTime->installEventFilter(this); m_comBoxDev->installEventFilter(this); m_comBoxAction->installEventFilter(this); /* 连接信号和槽 */ connect(m_comBoxDev,QOverload::of(&QComboBox::textActivated),this, &ExecPlanItem::do_devChanged); connect(m_comBoxAction,QOverload::of(&QComboBox::currentTextChanged),this,&ExecPlanItem::do_actionChanged); } /* 删除前,取消所有关联的信号和槽 */ ExecPlanItem::~ExecPlanItem() { disconnect(this); } /* 设置序号 */ void ExecPlanItem::setNum(int num) { m_num = num; m_labelNum->setText(QString::asprintf("%d",num)); } /* 获取序号 */ int ExecPlanItem::getNum() { return m_num; } /* 设置日期 */ void ExecPlanItem::setDate(const QDate &date) { m_date = date; m_labelDate->setText(m_date.toString("yyyy-MM-dd")); } /* 获取日期 */ QDate ExecPlanItem::getDate() { return m_date; } /* 设置开始时间 */ void ExecPlanItem::setExecTime(const QTime &time) { m_execTime = time; m_labelExecTime->setText(m_execTime.toString()); } /* 获取开始时间 */ QTime ExecPlanItem::getExecTime() const { return m_execTime; } /** * @brief 设置警告 * @param str 警告的内容 * @param ms 如果设置成0,将不启动定时器,一直显示警告内容 */ void ExecPlanItem::setWarningText(QString str,int ms) { m_labelWarning->setText(str); m_labelWarning->show(); if(ms > 0) { m_warnTimer->start(ms); } } /* 设置设备名称 */ void ExecPlanItem::setDevName(const QString &dev) { m_devName = dev; /* 寻找指向这个名称的设备信息 */ // m_cfgDev = DevInfo.cfgDevInfo().value(dev); m_cfgDev = DevInfo.findCfgDev(dev); /* 先屏蔽信号,防止添加项的过程中,乱发信号 */ QSignalBlocker bl(m_comBoxDev); m_comBoxDev->clear(); for(const auto& it : DevInfo.cfgDevInfo()) { m_comBoxDev->addItem(it->devName); } m_comBoxDev->setCurrentText(m_devName); /* 设置相应的动作 */ setActionName(); // SPDLOG_LOGGER_INFO(m_logger,"m_devName:{},当前项是:{}",m_devName.toStdString(),m_comBoxDev->currentText().toStdString()); } /* 获取设备名称 */ QString ExecPlanItem::getDevName() const { return m_devName; } /* 只修改设备名称,不修改设备类型,用于修改了设备名称,同步过来更新 */ void ExecPlanItem::changeDevName(const QString &name) { if(m_cfgDev->devName == name) { m_devName = name; m_comBoxDev->setCurrentText(name); }else { SPDLOG_LOGGER_WARN(m_logger,"修改后的设备名称和配置文件中不同:{}",name.toStdString()); } } /** * @brief 根据选择的设备设置相应的动作选项 * @param action */ void ExecPlanItem::setActionName(const QString &action) { m_actionName = action; m_comBoxAction->clear(); /* 获取这个设备 */ auto it = DevInfo.cfgDevInfo().value(m_comBoxDev->currentText(),nullptr); if(nullptr != it) { for(auto it1 = it->DevType.getDevAction().begin(); it1 != it->DevType.getDevAction().end(); it1++) { m_comBoxAction->addItem(it1.value(), static_cast(it1.key())); } } // SPDLOG_LOGGER_DEBUG(m_logger,"当前Action:{}",m_action.toStdString()); m_comBoxAction->setCurrentText(action); m_actionID = m_comBoxAction->currentData().toInt(); } /* 通过动作类型设置动作 */ void ExecPlanItem::setActionNum(int action) { } /* 设置动作,只设置可选择的动作类型 */ void ExecPlanItem::setActionName() { QString curAction = m_comBoxAction->currentText(); m_comBoxAction->clear(); auto it = DevInfo.cfgDevInfo().value(m_comBoxDev->currentText(),nullptr); if(nullptr != it) { for(auto it1 = it->DevType.getDevAction().begin();it1 != it->DevType.getDevAction().end();it1++) { m_comBoxAction->addItem(it1.value(), static_cast(it1.key())); } } m_comBoxAction->setCurrentText(curAction); } /* 获取动作 */ QString ExecPlanItem::getActionName() { return m_actionName; } /* 获取动作类型 */ int ExecPlanItem::getActionNum() { return m_actionID; } /* 获取日期类型 */ DateType ExecPlanItem::getDateType() { return m_dateType; } /* 隐藏警告 */ void ExecPlanItem::hideWarn() { m_labelWarning->hide(); } /* 获取设备信息 */ ConfigurationDevInfo *ExecPlanItem::getCfgDev() { return m_cfgDev; } /* 设备改变了,动作选项也跟着改变 */ void ExecPlanItem::do_devChanged(QString devName) { SPDLOG_LOGGER_DEBUG(m_logger,"更改Action,devName:{}",devName.toStdString()); /* 根据选择的设备,设置该设备的动作 */ m_comBoxAction->clear(); auto it = DevInfo.findCfgDev(devName); // SPDLOG_LOGGER_DEBUG(m_logger,"更改Action,devName:{}, it:{}",devName.toStdString(),it->devName.toStdString()); if(nullptr != it) { m_cfgDev = it; /* 将该设备支持的动作设置到选项中 */ for(auto it1 = it->DevType.getDevAction().begin();it1 != it->DevType.getDevAction().end();it1++) { m_comBoxAction->addItem(it1.value(), static_cast(it1.key())); } }else { SPDLOG_LOGGER_INFO(m_logger,"没有这个设备:{}",devName.toStdString()); return; } m_devName = devName; emit signal_devChanged(); } /* 动作改变了 */ void ExecPlanItem::do_actionChanged(QString action) { m_actionName = action; m_actionID = m_comBoxAction->currentData().toInt(); } /** * @brief 监测点击相关的label * @param watched * @param event * @return */ bool ExecPlanItem::eventFilter(QObject *watched, QEvent *event) { /* 关闭图标 */ if(watched == m_delete && event->type() == QEvent::MouseButtonPress) { auto e = static_cast(event); if(e->button() == Qt::LeftButton) { emit signal_OneItemDelete(m_num); return true; } } /* 点击日期 */ else if(watched == m_labelDate && event->type() == QEvent::MouseButtonPress) { auto e = static_cast(event); if(e->button() == Qt::LeftButton) { emit signal_dateClicked(m_date); return true; } } /* 点击执行时间 */ else if(watched == m_labelExecTime && event->type() == QEvent::MouseButtonPress) { auto e = static_cast(event); if(e->button() == Qt::LeftButton) { emit signal_execTimeClicked(m_execTime); return true; } } /* 滚轮事件 */ else if(event->type() == QEvent::Wheel) { return true; } return QWidget::eventFilter(watched,event); } /* 禁用这个项中所有的滚轮时间,这个不起效果 */ //void ExecPlanItem::wheelEvent(QWheelEvent *event) //{ // return; //}