#include "calendardtedit.h" #include #include #include #include #include #include "calendarex.h" #include "UIStyleManager.h" #include "spdlog/spdlog.h" CalendarDTEdit::CalendarDTEdit(QWidget *parent) : QDateTimeEdit(parent) { setCalendarPopup(false);// 阻止自带的日历窗口 setQSS(); } CalendarDTEdit::~CalendarDTEdit() { } void CalendarDTEdit::CloseCalendar() { } /* 手动触发日期选择弹框 */ void CalendarDTEdit::triggerCalendarPopup() { } /** * @brief 设置手动禁止修改日期区域,只能使用弹窗 * * @param value 是否禁止修改日期区域 * @param triggerPopup 点击日期区域是否会跳出弹窗 */ void CalendarDTEdit::setManualDisableEdit(bool value, bool triggerPopup) { if(value) { setReadOnly(true); for(auto& it : children()) { if(it->objectName() == "qt_spinbox_lineedit") { m_pCalendar = it; m_pCalendar->installEventFilter(this); } } }else { setReadOnly(false); if(m_pCalendar != nullptr) { m_pCalendar->removeEventFilter(this); m_pCalendar = nullptr; } } m_isPopup = triggerPopup; } /* 设置禁用日期选择器 */ void CalendarDTEdit::setCalendarEnabled(bool value) { setEnabled(value); m_isEnableCalendar = value; /* 先清空样式表 */ this->setProperty("disabled", !value); /* 重新生效QSS */ this->style()->unpolish(this); this->style()->polish(this); } /* 鼠标进入离开事件 */ void CalendarDTEdit::enterEvent(QEvent* event) { if(isEnabled() == false) { return; } this->setProperty("hover", true); this->style()->unpolish(this); this->style()->polish(this); QDateTimeEdit::enterEvent(event); // 保持父类行为 } /* 鼠标离开事件 */ void CalendarDTEdit::leaveEvent(QEvent* event) { if(isEnabled() == false) { return; } this->setProperty("hover", false); this->style()->unpolish(this); this->style()->polish(this); QDateTimeEdit::leaveEvent(event); // 保持父类行为 } void CalendarDTEdit::mousePressEvent(QMouseEvent *e) { Q_UNUSED(e); if(m_isEnableCalendar == false) { return; } CalendarEx *pC = new CalendarEx(date()); if (nullptr == pC) return; connect(pC, &CalendarEx::sig_DateChanged, this, [this](const QDate& date){ if (date.isValid()) { setDate(date); } }); pC->show(); pC->positionCalendarPopup(this); } /* 设置QSS */ void CalendarDTEdit::setQSS() { QString qssPath; if(UIStyle.getUIStyle() == EUIStyle::UI_Light) { qssPath = QString(":/qss/calendardtedit_light.qss"); }else { qssPath = QString(":/qss/calendardtedit_dark.qss"); } QFile file(qssPath); if(file.open(QFile::ReadOnly)) { QString qss = file.readAll(); this->setStyleSheet(qss); file.close(); } else { SPDLOG_WARN(nullptr, "打开QSS文件失败: {}", qssPath.toStdString()); } } bool CalendarDTEdit::eventFilter(QObject* watched, QEvent* event) { if(watched == m_pCalendar) { if(event->type() == QEvent::MouseButtonPress) { // qDebug() << "点击了日期区域"; if(m_isPopup) { mousePressEvent(nullptr); } } } return QDateTimeEdit::eventFilter(watched, event); }