qtmaterialcheckable_internal.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include "lib/qtmaterialcheckable_internal.h"
  2. #include <QPainter>
  3. #include <QIcon>
  4. #include <QTransform>
  5. #include "lib/qtmaterialcheckable.h"
  6. /*!
  7. * \class QtMaterialCheckableIcon
  8. * \internal
  9. */
  10. QtMaterialCheckableIcon::QtMaterialCheckableIcon(const QIcon &icon, QtMaterialCheckable *parent)
  11. : QWidget(parent),
  12. m_checkable(parent),
  13. m_color(Qt::black),
  14. m_icon(icon),
  15. m_iconSize(24),
  16. m_opacity(1.0)
  17. {
  18. Q_ASSERT(parent);
  19. setAttribute(Qt::WA_TransparentForMouseEvents);
  20. }
  21. QtMaterialCheckableIcon::~QtMaterialCheckableIcon()
  22. {
  23. }
  24. QSize QtMaterialCheckableIcon::sizeHint() const
  25. {
  26. return QSize(m_iconSize, m_iconSize);
  27. }
  28. void QtMaterialCheckableIcon::paintEvent(QPaintEvent *event)
  29. {
  30. Q_UNUSED(event)
  31. QPainter painter(this);
  32. painter.setRenderHint(QPainter::Antialiasing);
  33. painter.setOpacity(m_opacity);
  34. QPixmap pixmap = icon().pixmap(24, 24);
  35. if (!pixmap.isNull())
  36. {
  37. const qreal p = static_cast<qreal>((height())-m_iconSize)/2;
  38. const qreal z = m_iconSize/24;
  39. QTransform t;
  40. if (QtMaterialCheckable::LabelPositionLeft == m_checkable->labelPosition()) {
  41. t.translate(p+width()-42, p);
  42. } else {
  43. t.translate(p, p);
  44. }
  45. t.scale(z, z);
  46. painter.setTransform(t);
  47. QPainter icon(&pixmap);
  48. icon.setCompositionMode(QPainter::CompositionMode_SourceIn);
  49. icon.fillRect(pixmap.rect(), color());
  50. painter.drawPixmap(0, 0, pixmap);
  51. }
  52. }