惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
D
Docker
有赞技术团队
有赞技术团队
D
DataBreaches.Net
The GitHub Blog
The GitHub Blog
爱范儿
爱范儿
H
Help Net Security
美团技术团队
MyScale Blog
MyScale Blog
B
Blog RSS Feed
C
Check Point Blog
Microsoft Security Blog
Microsoft Security Blog
阮一峰的网络日志
阮一峰的网络日志
A
About on SuperTechFans
小众软件
小众软件
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
GbyAI
GbyAI
G
Google Developers Blog
月光博客
月光博客
Google DeepMind News
Google DeepMind News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Blog — PlanetScale
Blog — PlanetScale
MongoDB | Blog
MongoDB | Blog
F
Fortinet All Blogs

博客园 - 云山漫卷

AP与网桥概念对比 QT开源社区版账号申请 Lua语法深入1 LUA语法细节 docker 报(docker0)conflicts with network、networks have same bridge name CPU架构的演进(及其背后的指令集的演进) 上下拉电阻 树莓派中可由用户修改的配置文件 Linux下vi常用操作、常用命令 Lambda表达式二例 c++ 标准库多线程 git基本操作 Makefile中3个常用自动化变量 添加.pri文件并引入QCustomPlot图表库自定义图表 QTreeWidget 样式表 Qt css颜色对照表 删除界面上控件 解决错误no documents matching "ui 错误解决 allocation of incomplete type ‘Ui::
设置QT窗体的阴影效果
云山漫卷 · 2022-05-02 · via 博客园 - 云山漫卷

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