#ifndef QCUSTOMCALENDARWIDGET_H #define QCUSTOMCALENDARWIDGET_H #include #include #include #include class ScopeSelectionModel; class NoFocusStyle : public QProxyStyle { Q_OBJECT public: explicit NoFocusStyle(QObject *parent):QProxyStyle() { setParent(parent); } private: void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const; }; /** * @brief The CalendarWidgetEx class */ class CalendarWidgetEx : public QCalendarWidget { Q_OBJECT public: enum SelectMode { Normal, Multi, Scope, }; public: explicit CalendarWidgetEx(QWidget *parent = nullptr); ~CalendarWidgetEx() override {} void SetSelectMode(SelectMode mode, ScopeSelectionModel *pDataModel = nullptr); QList GetSelectDays(){return m_listMultiSelectDays;} void hideNavigatioinButton(bool bPreYear, bool bPreMon, bool bNextYear, bool bNextMon); private: QDate dateForCell(int row, int column) const; QDate referenceDate() const; int columnForFirstOfMonth(const QDate &date) const; int columnForDayOfWeek(int day) const; void initSkinColor(); protected: void paintCell(QPainter *painter, const QRect &rect, const QDate &date) const override; void paintEvent(QPaintEvent *) override; void mouseMoveEvent(QMouseEvent *event) override; void leaveEvent(QEvent *) override; public: QSize minimumSizeHint() const override; private slots: void OnClicked(const QDate &date); private: const QColor NORMAL_TEXT_BRIGHT{QColor(58,63,99)}; const QColor TODAY_TEXT_BRIGHT{QColor(68,88,254)}; const QColor SELECT_TEXT_BRIGHT{Qt::white}; const QColor DISABLE_TEXT_BRIGHT{QColor(133, 142, 189)}; const QColor SPLIT_LINE_BRIGHT{QColor(0, 0, 0, 23)}; const QColor SELECT_BRIGHT{QColor(68, 88, 254)}; const QColor HOVER_BRIGHT{QColor(227, 238, 255)}; const int DEFAULT_FONT_SIZE = 14; const int TEXT_WIDTH = 24; const qreal WINDOW_RADIUS = 2.0; const int WINDOW_WIDTH = 325; const int WINDOW_HEIGHT = 350; QDate m_dateMouseOver; QList m_listMultiSelectDays; SelectMode m_modeSelection; ScopeSelectionModel *m_pDateScopeModel; int m_nLineHeight; //星期和日之间的分割线的Y坐标 bool m_hasTopSplitLine; // 是否绘制顶部分割线 QColor m_normalTextColor; QColor m_todayTextColor; QColor m_selectTextColor; QColor m_disableTextColor; QColor m_splitLineColor; QColor m_selectBlockColor; QColor m_hoverBlockColor; }; #endif // QCUSTOMCALENDARWIDGET_H