idropshadowable.cpp 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include "idropshadowable.h"
  2. #include "dropshadowmgr.h"
  3. #include "../ImageBlur/imageblur.h"
  4. #include "PaintHelper/painthelper.h"
  5. #include <QDebug>
  6. /**
  7. * @brief IDropShadowable::IDropShadowable
  8. * @param selfWidget 阴影显示在这一层上
  9. */
  10. IDropShadowable::IDropShadowable(QWidget *selfWidget)
  11. : m_pSelfWidget(selfWidget)
  12. {
  13. selfWidget->installEventFilter(DropShadowMgr::Instance());
  14. }
  15. /**
  16. * @brief IDropShadowable::SetDropShadow
  17. * @param boxShadow
  18. * @param size 这个是阴影上面内容的大小
  19. */
  20. void IDropShadowable::SetDropShadow(const BoxShadow &boxShadow, const QSize &size)
  21. {
  22. /* 直接清除list,这单例阴影只能用在一个地方? */
  23. ClearDropShadow();
  24. DropShadowMgr::sm_cacheShadows.clear();
  25. m_listShadows.append(boxShadow);
  26. if(!DropShadowMgr::sm_cacheShadows.contains(boxShadow))
  27. {
  28. /* 一边阴影的宽度 */
  29. int radius = boxShadow.radius;
  30. /* 图片(阴影?)宽和高 */
  31. int imageWidth = size.width()+radius*2;
  32. int imageHeight = size.height()+radius*2;
  33. QImage image(imageWidth, imageHeight, QImage::Format_ARGB32);
  34. image.fill(boxShadow.color);
  35. //边框设为透明
  36. for(int x=0;x<image.width();x++)
  37. {
  38. for(int y=0;y<image.height();y++)
  39. {
  40. /* 设置阴影圈部分透明 */
  41. if(x>=radius && x<(image.width()-radius) && y>=radius && y<(image.height()-radius)) continue;
  42. image.setPixelColor(QPoint(x,y), Qt::transparent);
  43. }
  44. }
  45. /* 通过高斯模糊来设置阴影 */
  46. GaussBlur::Blur(image, boxShadow.radius);
  47. /* 又创建一个? */
  48. BoxShadow shadow_image(boxShadow);
  49. shadow_image.image = image;
  50. DropShadowMgr::sm_cacheShadows.append(shadow_image);
  51. }
  52. m_pSelfWidget->update();
  53. }
  54. void IDropShadowable::SetDropShadows(const QList<BoxShadow> &shadows, const QSize &size)
  55. {
  56. Q_UNUSED(shadows)
  57. Q_UNUSED(size)
  58. //找到最大的radius, x偏移, y偏移
  59. return;
  60. }
  61. void IDropShadowable::ClearDropShadow()
  62. {
  63. m_listShadows.clear();
  64. m_pSelfWidget->update();
  65. }
  66. /**
  67. * @brief 绘制阴影
  68. */
  69. void IDropShadowable::PaintShadows()
  70. {
  71. PainterEx painter(m_pSelfWidget);
  72. painter.setRenderHint(QPainter::Antialiasing);
  73. for(const BoxShadow &boxShadow: m_listShadows)
  74. {
  75. int index = DropShadowMgr::sm_cacheShadows.indexOf(boxShadow);
  76. if(index == -1) continue;
  77. QImage image = DropShadowMgr::sm_cacheShadows.at(index).image;
  78. painter.drawImage(image.rect(), image, image.rect());
  79. }
  80. }