| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 | 
							- #include "cdate.h"
 
- #include <QHBoxLayout>
 
- #include <QPainter>
 
- #include <QEvent>
 
- #include <QDebug>
 
- #include <QMouseEvent>
 
- #include <QEventLoop>
 
- #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<QMouseEvent*>(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();
 
-     });
 
- }
 
 
  |