设置QT窗体的阴影效果
1. 新创建一个QWidget为基类的ShadowEffect窗体项目:
2. 设置底板的垂直布局lay_bg,并设置margin为24;
3. 新建一个QWidget在它上面,命名为widget_bg,设置背景色等.
ShadowEffect.cpp
#include <QGraphicsDropShadowEffect> shadowEffect::shadowEffect(QWidget *parent) : QWidget(parent) , ui(new Ui::shadowEffect) { 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->setContentsMargins(24,24,24,24); }
大致效果如下:
注意,当需要全屏的时候,可以设置margin为0.
具体进一步改善阴影效果,了解下QGraphicsDropShadowEffect类。
此后,还需控制标题栏的拖拽移动:
void shadowEffect::mousePressEvent(QMouseEvent *e)
{
if( e->button() != Qt::LeftButton) return;
QRect r = this->ui->frameTitle->frameGeometry();
QRect globalRect(ui->frameTitle->mapToGlobal( r.topLeft() ), r.size() );
last = e->globalPosition().toPoint();
leftBtnClicked = true; //只有按下和释放两端的e->button()值为Qt::LeftButton,中间拖曳过程是Qt::NoButton。所以这里需存储标记
dragAvailable = globalRect.contains(last);
}
void shadowEffect::mouseMoveEvent(QMouseEvent *e)
{
if(leftBtnClicked && dragAvailable) {
this->move(this->pos() + e->globalPosition().toPoint() - last);
last = e->globalPosition().toPoint();
}
}
void shadowEffect::mouseReleaseEvent(QMouseEvent *e)
{
if(e->button() == Qt::LeftButton && dragAvailable) {
this->move(this->pos() + e->globalPosition().toPoint() - last);
dragAvailable = false;
leftBtnClicked = false;
}
}
参考了:https://blog.csdn.net/tonny7501/article/details/81748294