给QDialog设置窗口的阴影效果

 

(一)基本思路

先将所有窗口控件拖到一个QWidget,然后用setWindowFlags()设置窗口背景透明并使用QGraphicsDropShadowEffectQWidget出现阴影,于是,窗口像是本身被有了阴影效果。

(二)具体实现

  • void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on = true)设置窗口背景透明
setAttribute(Qt::WA_TranslucentBackground);
  • QGraphicsDropShadowEffect子部件添加阴影
QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(dialog);
    shadow->setOffset(0, 0);                                                                            //设置阴影距离
    shadow->setColor(Qt::black);                                                                //设置阴影颜色
    shadow->setBlurRadius(20);                                                                          //设置阴影圆角
    QWidget*widget = new QWidget(dialog);
    widget->setObjectName("widgetShadow");
    widget->setGraphicsEffect(shadow);  //设置阴影
    widget->setStyleSheet("#widgetShadow{background:#f5f5f5;border-radius:5px;}");//设置一下样式表,否则子窗口也会跟着透明

注意要给QWidget上背景色。

然后再把widget,移动到10,10,设置widget的大小为dialog的大小,dialog大小宽和高都扩大20


    QSize s= dialog->size();
    widget->resize(s);
    dialog->resize(s.width()+20,s.height()+20);
    widget->move(10,10);

接下来,把原属于dialog的控件,放到widget上面,坐标还是原来的坐标

    for(QWidget*w:dialog->findChildren<QWidget*>())
    {
        if(w != widget)
        {
            if(w->parent() == dialog)
            {
                QRect r = w->geometry();
                w->setParent(widget);
                w->setGeometry(r);
            }
        }
    }

最后详细代码如下,使用时直接调用就可以:

//设置阴影
void initSetShadow(QDialog*dialog)
{
    dialog->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint | dialog->windowFlags());
    dialog->setAttribute(Qt::WA_TranslucentBackground, true);

    QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(dialog);
    shadow->setOffset(0, 0);                                                                            //设置阴影距离
    shadow->setColor(Qt::black);                                                                //设置阴影颜色
    shadow->setBlurRadius(20);                                                                          //设置阴影圆角
    QWidget*widget = new QWidget(dialog);
    widget->setObjectName("widgetShadow");
    widget->setGraphicsEffect(shadow);  //设置阴影
    widget->setStyleSheet("#widgetShadow{background:#f5f5f5;border-radius:5px;}");//设置一下样式表,否则子窗口也会跟着透明

    QSize s= dialog->size();
    widget->resize(s);
    dialog->resize(s.width()+20,s.height()+20);
    widget->move(10,10);
    for(QWidget*w:dialog->findChildren<QWidget*>())
    {
        if(w != widget)
        {
            if(w->parent() == dialog)
            {
                QRect r = w->geometry();
                w->setParent(widget);
                w->setGeometry(r);
            }
        }
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值