Qt 给窗口绘制阴影

前言

最近自定义一个消息弹框,但是没加阴影之前,觉得有点扁平。然后仔细看了Qt自带的消息弹框,发现是没有加上阴影的问题。所以就在网上搜索怎么加阴影,有多种方法。写这个博客的目的是记录一下这几种方法,并且加上我对于这些方法的理解。

具体的方法有

  1. 重载paintEvent,调用drawRect或者drawRoundedRect或者drawPath来手绘阴影

  2. 使用QGraphicsDropShadowEffect类,来绘制阴影

  3. 使用九图拼凑法

  4. 九宫格缩放阴影法

但是不管是哪种方法,都需要设置窗口的背景透明

    this->setWindowFlags(Qt::FramelessWindowHint);
this->setAttribute(Qt::WA_TranslucentBackground);

重载paintEvent

这个方法就是重载paintEvent,然后自己设置绘图的区域,根据阴影的大小、根据阴影的颜色,一圈一圈的去画阴影。

然后又分有三个函数来进行阴影的绘制

  1. drawPath
    这个函数的作用是绘制一个路线,路线可以由很多不同的曲线或者直线组成,这个可以绘制多边形。

    绘制代码如下:
void Waiting::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event) // 1. 初始化一个QPainter对象用来绘制
// 2. QPainter::Antialiasing,让引擎尽可能的消除锯齿
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true); QColor color(0, 0, 0, 50);
// 此处循环次数为10,目的是绘制宽度为10的阴影
for(int i=0; i<10; i++)
{
// 3. 初始化一个QPainterPath对象
QPainterPath path;
// 4. 设置填充规则
path.setFillRule(Qt::WindingFill);
// 5. 添加一个矩形
path.addRect(10-i, 10-i, this->width()-(10-i)*2, this->height()-(10-i)*2);
// 6. 设置颜色的透明度
color.setAlpha(150 - qSqrt(i)*50);
painter.setPen(color);
// 7. 绘制线路
painter.drawPath(path);
}
}

绘制效果如下:

Tips:

  1. drawRectdrawRoundedRect
    这两个函数分别是画矩形阴影和画带圆角的阴影,除了最后绘制的时候锁调用的函数不一样,其余都是一样的。drawRect是绘制矩形的,drawRoundedRect是绘制带圆角的。


代码如下:

void Waiting::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event) QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true); QColor color(0, 0, 0, 50);
for(int i=0; i<10; i++)
{
color.setAlpha(150 - qSqrt(i)*50);
painter.setPen(color);
// drawRect 绘制矩形
// painter.drawRect(10-i, 10-i, this->width()-(10-i)*2, this->height()-(10-i)*2);
// drawRoundedRect 绘制带原角
painter.drawRoundedRect(10-i, 10-i, this->width()-(10-i)*2, this->height()-(10-i)*2, 20, 20);
}
}

效果图如下:

QGraphicsDropShadowEffect方法

这个类就直接用就好了,代码如下:

m_pEffect = new QGraphicsDropShadowEffect(m_background);
m_pEffect->setOffset(0, 0);
m_pEffect->setColor(QColor(QStringLiteral("black")));
m_pEffect->setBlurRadius(30);
m_background->setGraphicsEffect(m_pEffect);

Tips:

  1. setOffser这个是设置阴影的起始点位于窗口的哪个位置

  2. setBlurRadius这个是设置阴影的模糊程度,越大就越模糊

具体对比请看下图:

使用九图拼凑法

这个方法参考一去二三里大佬的博客:Qt之阴影边框_一去二三里_新浪博客

九宫格缩放阴影法

这里是另外以为大佬的博客:Qt之使用QPainter自绘实现窗口阴影边框_前行之路还需前行-CSDN博客

我这里只对大佬的代码进行一个自我的理解,具体内容,请移步去大佬的博客。
Tips:

  1. ninePatchScalePixmap函数

    iHorzSplitiVertSplit这两个变量分别代表对原始的图片进行九宫格分之后的高和宽。

    DstWidthDstHeight这个两个变量则代表最后需要的图片的高和宽

如下图:

Qt 给窗口绘制阴影的更多相关文章

  1. 给QT不规则窗口添加阴影

    在家休息,试着用QT去模仿各类管家软件的界面,做到自绘阴影的时候,蛋疼了. 网上搜到的基本都是一篇文章转来转去,一开始也被思路限制了. 尝试重载paintEvent,然后自己绘制矩形阴影,但是绘制的算 ...

  2. qt中窗口绘制——图片的绘制

    在qt 中,QPixmap 用于表示一张图片,支持png,jpg格式的加载. QPixmap pm("c:/test.png"); 或者 QPixmap pm; pm.load(& ...

  3. qt 自定义窗口绘制正弦曲线

    circlewidget.h #ifndef CIRCLAWIDGET_H #define CIRCLAWIDGET_H #include <QFrame> #include<QVe ...

  4. QT笔记之实现阴影窗口

    方法一: 代码实现 在窗口构造函数中加入:setAttribute(Qt::WA_TranslucentBackground),保证不被绘制上的部分透明 重写void paintEvent(QPain ...

  5. [Qt5] 使用Qt设计器绘制主窗口

    实践代码: git clone https://github.com/dilexliu/learn_qt5.git Step1: Qt设计器绘制窗口 保存会得到一个文件: mainwindow.ui ...

  6. C++框架_之Qt的窗口部件系统的详解-上

    C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...

  7. QT 基本图形绘制

    QT 基本图形绘制 1.告诉绘制引擎一些东西 QPainter::Antialiasing 在可能的情况下,反锯齿       QPainter::TextAntialiasing 在可能的情况下,文 ...

  8. Qt多窗口编程详解

    常用的窗体基类是 QWidget.QDialog 和 QMainWindow,在创建 GUI 应用程序时选择窗体基类就是从这 3 个类中选择. QWidget 直接继承于 QObject,是 QDia ...

  9. [转] - 使用Qt作窗口截屏(含源码)

    截屏(screenshot),就是将屏幕上的东西拷贝下来存成图片文件.介绍的好像有点多余:(,那我们就直接切入正题. QPixmap提供了两个函数grabWidget和grabWindow可以将屏幕上 ...

  10. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...

随机推荐

  1. 【转载】Spring Cloud Gateway排错、调试技巧总结

    http://www.imooc.com/article/290824 本文总结Spring Cloud Gateway的排错.调试技巧.欢迎留言补充! 第一式:Actuator监控端点 借助Actu ...

  2. jenkins build

    clean test org.jacoco:jacoco-maven-plugin:0.8.5:prepare-agent org.owasp:dependency-check-maven:5.3.0 ...

  3. Qt音视频开发29-Onvif云台控制

    一.前言 云台控制也是onvif功能中最常用的,最常用的功能排第一的是拿到视频流地址,排第二的就是云台控制了,云台控制的含义就是对带云台的摄像机进行上下左右的移动,一般云台摄像机都是带有一个小电机,一 ...

  4. 【宝塔】搭建随机图API

    创建站点 首先,我们打开服务器的宝塔面板,如果没安装的推荐安装一个,因为这个对建站小白来说非常的方便. 我们参加一个 API 站点 然后到站点设置里申请一个 ssl 认证,再打开强制 https 添加 ...

  5. 【原创】浅谈EtherCAT主站EOE(下)-EtherCAT IgH主站EoE具体实现

    目录 1.IgH 框架概述 2. IgH EOE机制 2.1 EoE服务规范 2.1 EoE虚拟网络设备 2.1.1 EoE Virtual Network Interfaces 2.1.2 EoE ...

  6. snpEff安装

    下载安装包: wget http://sourceforge.net/projects/snpeff/files/snpEff_v3_6_core.zip 解压安装包: unzip snpEff_v3 ...

  7. 监听sessionStorage中值的变化

    应用场景:将登录接口所返回的用户信息存入sessionStorage,在其他地方需要使用到用户信息,但不知道什么时候接口请求完,此时可以监听sessionStorage中值的变化. 应用:Event自 ...

  8. 微服务实战系列(三)-springcloud、springboot及maven之间关系-copy

    1 . 问题描述 随着springboot.springcloud的不断迭代升级,开发效率不断提升,越来越多的开发团队加入到spring的大军中,今天用通俗的语言,介绍下什么是springboot,s ...

  9. MySQL事务ACID-隔离级别-锁介绍

    ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则 ...

  10. OxyPlot:一个功能强大、漂亮.Net跨平台开源绘图库

    推荐一个支持多平台.多框架的.Net绘图库. 01 项目简介 OxyPlot是一个基于.NET开发的.跨平台的绘图库,可用于多种平台和框架,如WPF.Windows 8.Windows Phone.W ...