(一)基本思路
先将所有窗口控件拖到一个QWidget
,然后用setWindowFlags()
设置窗口背景透明并使用QGraphicsDropShadowEffect
让QWidget
出现阴影,于是,窗口像是本身被有了阴影效果。
(二)具体实现
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);
}
}
}
}