calendarwidgetex.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #ifndef QCUSTOMCALENDARWIDGET_H
  2. #define QCUSTOMCALENDARWIDGET_H
  3. #include <QCalendarWidget>
  4. #include <QPushButton>
  5. #include <QLabel>
  6. #include <QProxyStyle>
  7. class ScopeSelectionModel;
  8. class NoFocusStyle : public QProxyStyle
  9. {
  10. Q_OBJECT
  11. public:
  12. explicit NoFocusStyle(QObject *parent):QProxyStyle() { setParent(parent); }
  13. private:
  14. void drawPrimitive(PrimitiveElement element, const QStyleOption *option,
  15. QPainter *painter, const QWidget *widget) const;
  16. };
  17. /**
  18. * @brief The CalendarWidgetEx class
  19. */
  20. class CalendarWidgetEx : public QCalendarWidget
  21. {
  22. Q_OBJECT
  23. public:
  24. enum SelectMode
  25. {
  26. Normal,
  27. Multi,
  28. Scope,
  29. };
  30. public:
  31. explicit CalendarWidgetEx(QWidget *parent = nullptr);
  32. ~CalendarWidgetEx() override {}
  33. void SetSelectMode(SelectMode mode, ScopeSelectionModel *pDataModel = nullptr);
  34. QList<QDate> GetSelectDays(){return m_listMultiSelectDays;}
  35. void hideNavigatioinButton(bool bPreYear, bool bPreMon, bool bNextYear, bool bNextMon);
  36. private:
  37. QDate dateForCell(int row, int column) const;
  38. QDate referenceDate() const;
  39. int columnForFirstOfMonth(const QDate &date) const;
  40. int columnForDayOfWeek(int day) const;
  41. void initSkinColor();
  42. protected:
  43. void paintCell(QPainter *painter, const QRect &rect, const QDate &date) const override;
  44. void paintEvent(QPaintEvent *) override;
  45. void mouseMoveEvent(QMouseEvent *event) override;
  46. void leaveEvent(QEvent *) override;
  47. public:
  48. QSize minimumSizeHint() const override;
  49. private slots:
  50. void OnClicked(const QDate &date);
  51. private:
  52. const QColor NORMAL_TEXT_BRIGHT{QColor(58,63,99)};
  53. const QColor TODAY_TEXT_BRIGHT{QColor(68,88,254)};
  54. const QColor SELECT_TEXT_BRIGHT{Qt::white};
  55. const QColor DISABLE_TEXT_BRIGHT{QColor(133, 142, 189)};
  56. const QColor SPLIT_LINE_BRIGHT{QColor(0, 0, 0, 23)};
  57. const QColor SELECT_BRIGHT{QColor(68, 88, 254)};
  58. const QColor HOVER_BRIGHT{QColor(227, 238, 255)};
  59. const int DEFAULT_FONT_SIZE = 14;
  60. const int TEXT_WIDTH = 24;
  61. const qreal WINDOW_RADIUS = 2.0;
  62. const int WINDOW_WIDTH = 325;
  63. const int WINDOW_HEIGHT = 350;
  64. QDate m_dateMouseOver;
  65. QList<QDate> m_listMultiSelectDays;
  66. SelectMode m_modeSelection;
  67. ScopeSelectionModel *m_pDateScopeModel;
  68. int m_nLineHeight; //星期和日之间的分割线的Y坐标
  69. bool m_hasTopSplitLine; // 是否绘制顶部分割线
  70. QColor m_normalTextColor;
  71. QColor m_todayTextColor;
  72. QColor m_selectTextColor;
  73. QColor m_disableTextColor;
  74. QColor m_splitLineColor;
  75. QColor m_selectBlockColor;
  76. QColor m_hoverBlockColor;
  77. };
  78. #endif // QCUSTOMCALENDARWIDGET_H