#include "cdate.h" #include #include #include #include #include #include #include "calendarwidgetex.h" #include "oneshadow.h" CDate::CDate(const QDate& defaultDate,QWidget *parent,PopupType type) : QWidget{parent}, m_parent(parent), m_type(type) { init(defaultDate); } CDate::CDate(QWidget *parent,PopupType type) : QWidget{parent}, m_parent(parent), m_type(type) { // if(type == Popup) // { // setWindowFlags(Qt::FramelessWindowHint | Qt::Popup); // } init(QDate::currentDate()); } /* 阻塞执行 */ QDate CDate::execShow() { this->show(); QEventLoop loop; connect(this, &CDate::signal_close, &loop, &QEventLoop::quit); loop.exec(); return m_date; } /* 设置日期 */ void CDate::setDate(const QDate& date) { m_date = date; m_calendarEx->setSelectedDate(date); } void CDate::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); painter.drawImage(QPoint(0,0),m_shadow->image()); } /** * @brief 在这里实现点击空白处隐藏或者关闭自身 * @param watched * @param event * @return */ bool CDate::eventFilter(QObject *watched, QEvent *event) { auto me = dynamic_cast(event); if(nullptr != me) { if(me->type() == QEvent::MouseButtonPress) { if(m_type == Popup) { /* 先将自身区域和鼠标坐标都转换成全局坐标 */ QPoint gTopLeft = this->mapToGlobal(this->rect().topLeft()); QRect gRect(gTopLeft.x(),gTopLeft.y(),this->width(),this->height()); /* 判断此时的鼠标坐标是否在这个控件中 */ if(!gRect.contains(me->globalPos())) { // qDebug() << QTime::currentTime() << "CDate关闭了"; emit signal_DateChanged(m_date); /* 发送信号,关闭自身 */ emit signal_close(); this->close(); } } } } return QWidget::eventFilter(watched,event); } void CDate::init(const QDate &defaultDate) { /* 设置无边框 */ setWindowFlags(Qt::FramelessWindowHint); /* 设置底层样式表,让最底层的透明 */ this->setAttribute(Qt::WA_TranslucentBackground); /* 将父类的事件注册给自己 */ if(m_type == Popup && m_parent != nullptr) { m_parent->installEventFilter(this); } /* 设置布局,通过设置layout的Margin距离显示阴影 */ QHBoxLayout* layout = new QHBoxLayout(this); this->setLayout(layout); layout->setMargin(RADIUS); this->resize(CALENDAR_WIDTH + RADIUS*2,CALENDAR_HEIGHT + RADIUS*2); /* 设置日历组件 */ m_calendarEx = new CalendarWidgetEx(this); m_calendarEx->resize(CALENDAR_WIDTH,CALENDAR_HEIGHT); m_calendarEx->setCurrentPage(defaultDate.year(),defaultDate.month()); m_calendarEx->setSelectedDate(defaultDate); layout->addWidget(m_calendarEx); /* 设置自身时间 */ m_date = defaultDate; /* 设置阴影 */ m_shadow = new OneShadow(QSize(m_calendarEx->width(),m_calendarEx->height()),RADIUS); /* 信号和槽 */ connect(m_calendarEx,&CalendarWidgetEx::clicked,this,[this](const QDate& date){ m_date = date; emit signal_DateChanged(date); emit signal_close(); this->close(); }); }