设置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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人