#include "idropshadowable.h" #include "dropshadowmgr.h" #include "../ImageBlur/imageblur.h" #include "PaintHelper/painthelper.h" #include /** * @brief IDropShadowable::IDropShadowable * @param selfWidget 阴影显示在这一层上 */ IDropShadowable::IDropShadowable(QWidget *selfWidget) : m_pSelfWidget(selfWidget) { selfWidget->installEventFilter(DropShadowMgr::Instance()); } /** * @brief IDropShadowable::SetDropShadow * @param boxShadow * @param size 这个是阴影上面内容的大小 */ void IDropShadowable::SetDropShadow(const BoxShadow &boxShadow, const QSize &size) { /* 直接清除list,这单例阴影只能用在一个地方? */ ClearDropShadow(); DropShadowMgr::sm_cacheShadows.clear(); m_listShadows.append(boxShadow); if(!DropShadowMgr::sm_cacheShadows.contains(boxShadow)) { /* 一边阴影的宽度 */ int radius = boxShadow.radius; /* 图片(阴影?)宽和高 */ int imageWidth = size.width()+radius*2; int imageHeight = size.height()+radius*2; QImage image(imageWidth, imageHeight, QImage::Format_ARGB32); image.fill(boxShadow.color); //边框设为透明 for(int x=0;x=radius && x<(image.width()-radius) && y>=radius && y<(image.height()-radius)) continue; image.setPixelColor(QPoint(x,y), Qt::transparent); } } /* 通过高斯模糊来设置阴影 */ GaussBlur::Blur(image, boxShadow.radius); /* 又创建一个? */ BoxShadow shadow_image(boxShadow); shadow_image.image = image; DropShadowMgr::sm_cacheShadows.append(shadow_image); } m_pSelfWidget->update(); } void IDropShadowable::SetDropShadows(const QList &shadows, const QSize &size) { Q_UNUSED(shadows) Q_UNUSED(size) //找到最大的radius, x偏移, y偏移 return; } void IDropShadowable::ClearDropShadow() { m_listShadows.clear(); m_pSelfWidget->update(); } /** * @brief 绘制阴影 */ void IDropShadowable::PaintShadows() { PainterEx painter(m_pSelfWidget); painter.setRenderHint(QPainter::Antialiasing); for(const BoxShadow &boxShadow: m_listShadows) { int index = DropShadowMgr::sm_cacheShadows.indexOf(boxShadow); if(index == -1) continue; QImage image = DropShadowMgr::sm_cacheShadows.at(index).image; painter.drawImage(image.rect(), image, image.rect()); } }