| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 | #include "calendarex.h"#include <QEvent>#include <QScreen>#include <QKeyEvent>#include <QApplication>#include <QDesktopWidget>#include <QHBoxLayout>#include <QDebug>#include "scopeselectionmodel.h"#include "PaintHelper/painthelper.h"CalendarInterface::CalendarInterface(QWidget *parent)    : QWidget(parent)    , IDropShadowable(this)    , m_pLayout(new QHBoxLayout){    setWindowFlag(Qt::Popup);    setWindowFlag(Qt::NoDropShadowWindowHint);    //设置无边框属性    setWindowFlag(Qt::FramelessWindowHint);    //设置背景透明属性    setAttribute(Qt::WA_TranslucentBackground, true);    //关闭对话框时,删除自身对象    setAttribute(Qt::WA_DeleteOnClose, true);}CalendarInterface::~CalendarInterface(){    //qDebug()<<"~ScopeCalendar";}/** * @brief 这个只是坐标位移? * @param q */void CalendarInterface::positionCalendarPopup(QWidget *q){    if (nullptr == m_pLayout) return;    QPoint pos = (q->layoutDirection() == Qt::RightToLeft) ? q->rect().bottomRight() : q->rect().bottomLeft();    QPoint pos2 = (q->layoutDirection() == Qt::RightToLeft) ? q->rect().topRight() : q->rect().topLeft();    pos = q->mapToGlobal(pos);    pos2 = q->mapToGlobal(pos2);    QSize size = QSize(CALENDAR_WIDTH * m_pLayout->count() + 2 * SHADOW_RADIUS, CALENDAR_HEIGHT + 2 * SHADOW_RADIUS);    //QRect screen = QApplication::desktop()->availableGeometry(pos);    QRect screen = QGuiApplication::screenAt(pos)->availableGeometry();    //handle popup falling "off screen"    if (q->layoutDirection() == Qt::RightToLeft) {        pos.setX(pos.x()-size.width());        pos2.setX(pos2.x()-size.width());        if (pos.x() < screen.left())            pos.setX(qMax(pos.x(), screen.left()));        else if (pos.x()+size.width() > screen.right())            pos.setX(qMax(pos.x()-size.width(), screen.right()-size.width()));    } else {        if (pos.x()+size.width() > screen.right())            pos.setX(screen.right()-size.width());        pos.setX(qMax(pos.x(), screen.left()));    }    if (pos.y() + size.height() > screen.bottom())        pos.setY(pos2.y() - size.height());    else if (pos.y() < screen.top())        pos.setY(screen.top());    if (pos.y() < screen.top())        pos.setY(screen.top());    if (pos.y()+size.height() > screen.bottom())        pos.setY(screen.bottom()-size.height());    pos.setX(pos.rx() - SHADOW_RADIUS);    pos.setY(pos.ry() - SHADOW_RADIUS + SPACING);    move(pos);}CalendarEx::CalendarEx(const QDate& defaultDate, QWidget* parent) :    CalendarInterface(parent),    m_pCalendar(nullptr){    QHBoxLayout* pLay = new QHBoxLayout(this);    QWidget* pMain = new QWidget(this);    pMain->setLayout(m_pLayout);    pLay->addWidget(pMain);    pLay->setMargin(SHADOW_RADIUS);    m_pCalendar = new CalendarWidgetEx(this);    m_pCalendar->setStyleSheet("QCalendarView{background-color: transparent;}");    m_pLayout->addWidget(m_pCalendar);    connect(m_pCalendar, &CalendarWidgetEx::clicked, this, [this](const QDate& date){        emit sig_DateChanged(date);        close();    });    m_pLayout->setMargin(0);    pMain->resize(CALENDAR_WIDTH, CALENDAR_HEIGHT);    SetCalendarSync(defaultDate);    /* 设置大小,包含阴影的大小 */    resize(CALENDAR_WIDTH + 2 * SHADOW_RADIUS, CALENDAR_HEIGHT + 2 * SHADOW_RADIUS);    /* 设置阴影 */    SetDropShadow(BoxShadow{0, 0, SHADOW_RADIUS, 0, QColor(0, 0, 0, 60), QSize(0, 0), QImage()}, pMain->size());}void CalendarEx::SetCalendarSync(const QDate &defaultDate){    if (nullptr == m_pCalendar || !defaultDate.isValid()) return;    m_pCalendar->setCurrentPage(defaultDate.year(), defaultDate.month());    m_pCalendar->setSelectedDate(defaultDate);}ScopedCalendar::ScopedCalendar(const QDate &from, const QDate &to, QWidget *parent) :    CalendarInterface(parent),    m_pCalendar_L(nullptr),    m_pCalendar_R(nullptr){    QHBoxLayout* pLay = new QHBoxLayout(this);    QWidget* pMain = new QWidget(this);    pMain->setLayout(m_pLayout);    pLay->addWidget(pMain);    pLay->setMargin(SHADOW_RADIUS);    ScopeSelectionModel *pDateScopeModel = new ScopeSelectionModel();    if(from.isValid() && to.isValid())    {        pDateScopeModel->dtFirst = from;        pDateScopeModel->dtSecond = to;        pDateScopeModel->bLocked = true;    }    m_pCalendar_L = new CalendarWidgetEx(this);    m_pCalendar_L->setStyleSheet("QCalendarView{background-color: transparent;}");    m_pCalendar_L->SetSelectMode(CalendarWidgetEx::Scope, pDateScopeModel);    m_pCalendar_L->hideNavigatioinButton(false, false, true, true);    m_pLayout->addWidget(m_pCalendar_L);    m_pCalendar_R = new CalendarWidgetEx(this);    m_pCalendar_R->setStyleSheet("QCalendarView{background-color: transparent;}");    m_pCalendar_R->SetSelectMode(CalendarWidgetEx::Scope, pDateScopeModel);    m_pCalendar_R->hideNavigatioinButton(true, true, false, false);    m_pLayout->addWidget(m_pCalendar_R);    m_pLayout->setSpacing(0);    m_pLayout->setMargin(0);    pMain->resize(2 * CALENDAR_WIDTH, CALENDAR_HEIGHT);    SetCalendarSync(from);    connect(pDateScopeModel, &ScopeSelectionModel::sig_ScopeSelected, this, &ScopedCalendar::OnScopeSelected);    resize(2 * CALENDAR_WIDTH + 2 * SHADOW_RADIUS, CALENDAR_HEIGHT + 2 * SHADOW_RADIUS);    SetDropShadow(BoxShadow{0, 0, SHADOW_RADIUS, 0, QColor(0, 0, 0, 60), QSize(0, 0), QImage()}, pMain->size());}void ScopedCalendar::SetMinimumDate(const QDate &date){    if (nullptr == m_pCalendar_L || nullptr == m_pCalendar_R) return;    m_pCalendar_L->setMinimumDate(date);    m_pCalendar_R->setMinimumDate(date);}void ScopedCalendar::SetMaximumDate(const QDate &date){    if (nullptr == m_pCalendar_L || nullptr == m_pCalendar_R) return;    m_pCalendar_L->setMaximumDate(date);    m_pCalendar_R->setMaximumDate(date);}void ScopedCalendar::OnScopeSelected(const QDate &from, const QDate &to){    emit sig_ScopeSelected(from, to);    close();}void ScopedCalendar::SetCalendarSync(const QDate &defaultDate){    if (nullptr == m_pCalendar_L || nullptr == m_pCalendar_R || !defaultDate.isValid()) return;    m_pCalendar_L->setCurrentPage(defaultDate.year(), defaultDate.month());    connect(m_pCalendar_L, &QCalendarWidget::currentPageChanged, this, [&](int year, int month) {        QDate nextMonth = QDate(year, month, 1).addMonths(1);        m_pCalendar_R->setCurrentPage(nextMonth.year(), nextMonth.month());    });    m_pCalendar_R->setCurrentPage(defaultDate.addMonths(1).year(), defaultDate.addMonths(1).month());    connect(m_pCalendar_R, &QCalendarWidget::currentPageChanged, this, [&](int year, int month) {        QDate prevMonth = QDate(year, month, 1).addMonths(-1);        m_pCalendar_L->setCurrentPage(prevMonth.year(), prevMonth.month());    });}
 |