给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);
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/hss2799/article/details/110160413