1.QGraphicsDropShadowEffect接口
//实例(QWidget* object)阴影shadow
QGraphicsDropShadowEffect* shadow = new QGraphicsDropShadowEffect(object);
//设置阴影距离
shadow->setOffset(0, 0);
//设置阴影颜色
shadow->setColor(color);//#444444
//设置阴影圆角
shadow->setBlurRadius(10);
//给嵌套QWidget设置阴影
object->setGraphicsEffect(shadow);
2.自绘
原理:沿着窗口边框一圈一圈的画线,颜色逐圈改变透明度,在paintEvent函数内实现
QPainterPath path;
path.setFillRule(Qt::WindingFill);
path.addRoundedRect(5, 5, this->width() - 5 * 2, this->height() - 5 * 2, 3, 3);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.fillPath(path, QBrush(Qt::white));
QColor color(Qt::gray);
for (int i = 0; i < 5; i++)
{
QPainterPath path;
path.setFillRule(Qt::WindingFill);
path.addRoundedRect(5 - i, 5 - i, this->width() - (5 - i) * 2, this->height() - (5 - i) * 2, 3 + i, 3 + i);
color.setAlpha(80 - qSqrt(i) * 40);
painter.setPen(color);
painter.drawPath(path);
}
3 DwmExtendFrameIntoClientArea
依赖dwmapi.lib
HWND hWnd = reinterpret_cast<HWND>(winId());
DWMNCRENDERINGPOLICY ncrp = DWMNCRP_ENABLED;
::DwmSetWindowAttribute(hWnd, DWMWA_NCRENDERING_POLICY, &ncrp, sizeof(ncrp));
MARGINS shadow = {1,1,1,1};
DwmExtendFrameIntoClientArea((HWND)winId(), &shadow);