实现原理:
QWidget互相嵌套, 以一个窗口QWidget作为阴影的画板, 嵌套QWidget设置阴影
第一步:新建一个qt工程,选择QWidget作为主界面的基类
第二步, 先按照如图自己在ui界面添加一个widget, 并进行垂直布局, 布局器更名:lay_bg。详细步骤如下:
拖一个Widget到ui界面上,然后选择Widget,垂直布局:
这里的Layout改成lay_bg,其他保持默认就可以了。
给子QWidget添加背景颜色,通过qss添加:
background-color:lightgray
在widget.cpp中:
#include "widget.h"
#include "ui_widget.h"
#include <QGraphicsDropShadowEffect>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//设置窗体透明
this->setAttribute(Qt::WA_TranslucentBackground, true);
//设置无边框
this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
//实例阴影shadow
QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this);
//设置阴影距离
shadow->setOffset(0, 0);
//设置阴影颜色
shadow->setColor(QColor("#444444"));
//设置阴影圆角
shadow->setBlurRadius(30);
//给嵌套QWidget设置阴影
ui->widget_bg->setGraphicsEffect(shadow);
//给垂直布局器设置边距(此步很重要, 设置宽度为阴影的宽度)
ui->lay_bg->setMargin(24);
// ui->lay_bg->setMargin(0); 设置为0时,就看不到边框的阴影了
}
Widget::~Widget()
{
delete ui;
}
如果你没设置widget_bg的背景颜色,因为背景透明的原因,你将什么都看不到。(假如你在widget_bg中添加了一些子控件,而没有设置widget_bg背景颜色,就会看到widget_bg中的子控件都有阴影)
最终效果:
参考:
https://blog.csdn.net/tonny7501/article/details/81748294
下面这种是用九宫格贴图,挂载方式(推荐用这种方式,稍微改造一下,添加窗口移动效果,就可以用到项目中去了,非入侵式,对有代码改动少)
自定义标题栏无边框阴影窗口