QAntAbstractButton.h 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. //
  2. // Created by Louis on 25-4-1.
  3. //
  4. #ifndef QANTABSTRACTBUTTON_H
  5. #define QANTABSTRACTBUTTON_H
  6. #include <qwidget.h>
  7. #include <qpainter.h>
  8. #include <qicon.h>
  9. #include <qtimer.h>
  10. #include <qevent.h>
  11. #include <qfontmetrics.h>
  12. class QAntAbstractButton : public QWidget{
  13. Q_OBJECT
  14. public:
  15. enum ButtonState {
  16. NormalState,
  17. HoverState,
  18. PressedState,
  19. DisabledState,
  20. LoadingState
  21. };
  22. Q_ENUM(ButtonState)
  23. explicit QAntAbstractButton(QWidget* parent = nullptr);
  24. virtual ~QAntAbstractButton();
  25. QString text() const;
  26. void setText(const QString& text);
  27. QIcon icon() const;
  28. void setIcon(const QIcon& icon);
  29. QSize iconSize() const;
  30. void setIconSize(const QSize& size);
  31. QMargins padding() const;
  32. void setPadding(const QMargins& margins);
  33. ButtonState currentState() const;
  34. signals:
  35. void clicked();
  36. void pressed();
  37. void release();
  38. void textChanged(const QString& text);
  39. void iconChanged(const QIcon& icon);
  40. void enabledChanged(bool enabled);
  41. void loadingChanged(bool loading);
  42. protected:
  43. virtual void paintNormalState(QPainter& painter) = 0;
  44. virtual void paintHoverState(QPainter& painter) = 0;
  45. virtual void paintPressedState(QPainter& painter) = 0;
  46. virtual void paintDisabledState(QPainter& painter) = 0;
  47. virtual void paintLoadingState(QPainter& painter) = 0;
  48. virtual void paintText(QPainter& painter, const QRect& textRect);
  49. virtual void paintIcon(QPainter& painter, const QRect& iconRect);
  50. virtual void paintFocusIndicator(QPainter& painter);
  51. virtual void paintBackground(QPainter& painter);
  52. virtual void paintBorder(QPainter& painter);
  53. virtual QRect calculateTextRect(const QRect& contentsRect) const;
  54. virtual QRect calculateIconRect(const QRect& contentsRect) const;
  55. void paintEvent(QPaintEvent* event) override;
  56. void mousePressEvent(QMouseEvent *event) override;
  57. void mouseReleaseEvent(QMouseEvent *event) override;
  58. void mouseMoveEvent(QMouseEvent *event) override;
  59. void enterEvent(QEnterEvent *event) override;
  60. void leaveEvent(QEvent *event) override;
  61. void focusInEvent(QFocusEvent *event) override;
  62. void focusOutEvent(QFocusEvent *event) override;
  63. void changeEvent(QEvent *) override;
  64. void updateButtonState(ButtonState newState);
  65. void animateStateChange(ButtonState oldState, ButtonState newState);
  66. private:
  67. QString m_text;
  68. QIcon m_icon;
  69. QSize m_iconSize = QSize(16, 16);
  70. QMargins m_padding = QMargins(8, 4, 8, 4);
  71. ButtonState m_state = NormalState;
  72. bool m_loading = false;
  73. bool m_mousePressed = false;
  74. bool m_hasFocus = false;
  75. };
  76. #endif //QANTABSTRACTBUTTON_H