qtmaterialraisedbutton.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include "qtmaterialraisedbutton.h"
  2. #include "qtmaterialraisedbutton_p.h"
  3. #include <QStateMachine>
  4. #include <QtWidgets/QGraphicsDropShadowEffect>
  5. #include <QPropertyAnimation>
  6. #include <QEventTransition>
  7. /*!
  8. * \class QtMaterialRaisedButtonPrivate
  9. * \internal
  10. */
  11. /*!
  12. * \internal
  13. */
  14. QtMaterialRaisedButtonPrivate::QtMaterialRaisedButtonPrivate(QtMaterialRaisedButton *q)
  15. : QtMaterialFlatButtonPrivate(q)
  16. {
  17. }
  18. /*!
  19. * \internal
  20. */
  21. QtMaterialRaisedButtonPrivate::~QtMaterialRaisedButtonPrivate()
  22. {
  23. }
  24. /*!
  25. * \internal
  26. */
  27. void QtMaterialRaisedButtonPrivate::init()
  28. {
  29. Q_Q(QtMaterialRaisedButton);
  30. shadowStateMachine = new QStateMachine(q);
  31. normalState = new QState;
  32. pressedState = new QState;
  33. effect = new QGraphicsDropShadowEffect;
  34. effect->setBlurRadius(7);
  35. effect->setOffset(QPointF(0, 2));
  36. effect->setColor(QColor(0, 0, 0, 75));
  37. q->setBackgroundMode(Qt::OpaqueMode);
  38. q->setMinimumHeight(42);
  39. q->setGraphicsEffect(effect);
  40. q->setBaseOpacity(0.3);
  41. shadowStateMachine->addState(normalState);
  42. shadowStateMachine->addState(pressedState);
  43. normalState->assignProperty(effect, "offset", QPointF(0, 2));
  44. normalState->assignProperty(effect, "blurRadius", 7);
  45. pressedState->assignProperty(effect, "offset", QPointF(0, 5));
  46. pressedState->assignProperty(effect, "blurRadius", 29);
  47. QAbstractTransition *transition;
  48. transition = new QEventTransition(q, QEvent::MouseButtonPress);
  49. transition->setTargetState(pressedState);
  50. normalState->addTransition(transition);
  51. transition = new QEventTransition(q, QEvent::MouseButtonDblClick);
  52. transition->setTargetState(pressedState);
  53. normalState->addTransition(transition);
  54. transition = new QEventTransition(q, QEvent::MouseButtonRelease);
  55. transition->setTargetState(normalState);
  56. pressedState->addTransition(transition);
  57. QPropertyAnimation *animation;
  58. animation = new QPropertyAnimation(effect, "offset", q);
  59. animation->setDuration(100);
  60. shadowStateMachine->addDefaultAnimation(animation);
  61. animation = new QPropertyAnimation(effect, "blurRadius", q);
  62. animation->setDuration(100);
  63. shadowStateMachine->addDefaultAnimation(animation);
  64. shadowStateMachine->setInitialState(normalState);
  65. shadowStateMachine->start();
  66. }
  67. /*!
  68. * \class QtMaterialRaisedButton
  69. */
  70. QtMaterialRaisedButton::QtMaterialRaisedButton(QWidget *parent)
  71. : QtMaterialFlatButton(*new QtMaterialRaisedButtonPrivate(this), parent)
  72. {
  73. d_func()->init();
  74. }
  75. QtMaterialRaisedButton::QtMaterialRaisedButton(const QString &text, QWidget *parent)
  76. : QtMaterialFlatButton(*new QtMaterialRaisedButtonPrivate(this), parent)
  77. {
  78. d_func()->init();
  79. setText(text);
  80. }
  81. QtMaterialRaisedButton::~QtMaterialRaisedButton()
  82. {
  83. }
  84. QtMaterialRaisedButton::QtMaterialRaisedButton(QtMaterialRaisedButtonPrivate &d, QWidget *parent)
  85. : QtMaterialFlatButton(d, parent)
  86. {
  87. d_func()->init();
  88. }
  89. bool QtMaterialRaisedButton::event(QEvent *event)
  90. {
  91. Q_D(QtMaterialRaisedButton);
  92. if (QEvent::EnabledChange == event->type()) {
  93. if (isEnabled()) {
  94. d->shadowStateMachine->start();
  95. d->effect->setEnabled(true);
  96. } else {
  97. d->shadowStateMachine->stop();
  98. d->effect->setEnabled(false);
  99. }
  100. }
  101. return QtMaterialFlatButton::event(event);
  102. }