Qt 无边框窗口实现窗口阴影的两种方法,QGraphicsDropShadowEffect 导致 QOpenGLWidget 不显示

1、QGraphicsDropShadowEffect

setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground);
QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect();
effect->setBlurRadius(20);
effect->setColor(QColor::fromRgbF(0, 0, 0, 0.7));
effect->setOffset(0, 0);
setGraphicsEffect(effect);

该方法会导致设置了QGraphicsDropShadowEffect的QOpenGLWidget类型子窗口不显示(好像是Qt的Bug),所以当界面用到QOpenGLWidget时,最好使用下面的方法。
2、QPainter 绘制

如第一种方法,窗口也需要设置为背景透明的。

void paintEvent(QPaintEvent *event)
{  
   if (isMaximized())
   {
       return;
   }
   int nShadowsWidth = 6;
   int nRadius = 3;
   QPainterPath path;
   path.setFillRule(Qt::WindingFill);
   path.addRoundedRect(nShadowsWidth, nShadowsWidth, this->width() - nShadowsWidth * 2, this->height() - nShadowsWidth * 2, nRadius, nRadius);
   QPainter painter(this);
   QColor color(0, 0, 0, 200);
   for (int i = 0; i < nShadowsWidth; i++)
   {
       QPainterPath path;
       path.setFillRule(Qt::WindingFill);
       path.addRoundedRect(nShadowsWidth - i, nShadowsWidth - i, this->width() - (nShadowsWidth - i) * 2, this->height() - (nShadowsWidth - i) * 2, nRadius + i, nRadius + i);
       color.setAlpha(100 - qSqrt(i) * 50);
       painter.setPen(color);
       painter.drawPath(path);
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值