#ifndef QCUSTOMCALENDARWIDGET_H #define QCUSTOMCALENDARWIDGET_H #include #include #include #include #include "calendarheader.h" #include "calendarnav.h" 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); /* 设置UI样式,0亮色,1暗色 */ void setUIStyle(); 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: int m_style = 0; CalendarNav* m_pNav = nullptr; CalendarHeader* m_pHeader = nullptr; /* 亮色 */ 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 QColor BG_BRUSH_BRIGHT{QColor(255,255,255)}; /* 背景 */ const QColor BG_PEN_BRIGHT{QColor(0, 0, 0, 23)}; /* 线条 */ /* 暗色 */ const QColor NORMAL_TEXT_DEEP{QColor(255,255,255,230)}; const QColor TODAY_TEXT_DEEP{Qt::black}; const QColor SELECT_TEXT_DEEP{Qt::black}; const QColor DISABLE_TEXT_DEEP{QColor(255,255,255,77)}; const QColor SPLIT_LINE_DEEP{QColor(255,255,255,64)}; const QColor SELECT_DEEP{QColor(233, 161, 18)}; const QColor HOVER_DEEP{QColor(132, 134, 136)}; const QColor TODAY_DEEP{QColor(67, 142, 255)}; const QColor BG_PEN_DEEP{QColor(255,255,255,51)}; /* 线条 */ const QColor BG_BRUSH_DEEP{QColor{116,117,120}}; /* 背景 */ const QColor BG_SPECIAL_PEN_DEEP{QColor{27, 186, 102}}; const QColor BG_SPECIAL_BRUSH_DEEP{QColor{78, 112, 97}}; const int DEFAULT_FONT_SIZE = 16; const int TEXT_WIDTH = 24; const qreal WINDOW_RADIUS = 4.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; QColor m_bgBrushColor; /* 背景画刷 */ QColor m_bgPenColor; /* 背景画笔 */ }; #endif // QCUSTOMCALENDARWIDGET_H