Qt实现给窗口绘制阴影的示例代码

 更新时间:2022年11月25日 09:52:11   作者:音视频开发老舅  
这篇文章主要为大家详细介绍了Qt实现给窗口绘制阴影的方法,文中的示例代码讲解详细,对我们学习Qt有一定的帮助,感兴趣的可以了解一下

前言

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

具体的方法有

  • 重载paintEvent,调用drawRect或者drawRoundedRect或者drawPath来手绘阴影
  • 使用QGraphicsDropShadowEffect类,来绘制阴影
  • 使用九图拼凑法
  • 九宫格缩放阴影法

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

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

重载paintEvent法

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

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

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

drawRect和drawRoundedRect

这两个函数分别是画矩形阴影和画带圆角的阴影,除了最后绘制的时候锁调用的函数不一样,其余都是一样的。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

setOffser这个是设置阴影的起始点位于窗口的哪个位置setBlurRadius这个是设置阴影的模糊程度,越大就越模糊

具体对比请看下图:

九宫格缩放阴影法

Tips:

  • ninePatchScalePixmap函数
  • iHorzSplit和iVertSplit这两个变量分别代表对原始的图片进行九宫格分之后的高和宽。
  • DstWidth和DstHeight这个两个变量则代表最后需要的图片的高和宽

如下图:

到此这篇关于Qt实现给窗口绘制阴影的示例代码的文章就介绍到这了,更多相关Qt窗口绘制阴影内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用C++ R3层断链实现模块隐藏功能

    利用C++ R3层断链实现模块隐藏功能

    在R3层的模块隐藏,我们需要做的就是将其该链表断链,将某一模块从这个双向链表中摘除,这样再调用传统的API时就会搜索不到。本文重点给大家介绍利用C++ R3层断链实现模块隐藏功能,感兴趣的朋友一起看看吧
    2019-10-10
  • linux c程序中获取shell脚本输出的实现方法

    linux c程序中获取shell脚本输出的实现方法

    以下是对在linux下c程序中获取shell脚本输出的实现方法进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-08-08
  • C语言栈与队列面试题详解

    C语言栈与队列面试题详解

    栈和队列,严格意义上来说,也属于线性表,因为它们也都用于存储逻辑关系为 "一对一" 的数据,但由于它们比较特殊,因此将其单独作为一章,做重点讲解
    2022-04-04
  • C语言深入讲解栈与堆和静态存储区的使用

    C语言深入讲解栈与堆和静态存储区的使用

    对大多数C 语言初学者来说,堆栈却是一个很模糊的概念。堆栈是一种数据结构,一个在程序运行时用于存放的地方,相信这可能是很多初学者共同的认识,静态存储区即内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在
    2022-04-04
  • 举例讲解C语言对归并排序算法的基础使用

    举例讲解C语言对归并排序算法的基础使用

    这篇文章主要介绍了C语言对归并排序算法的使用,归并排序算法的平均事件复杂度为(n\log n),需要的朋友可以参考下
    2016-05-05
  • C++使用异或运算实现交换两个数的值

    C++使用异或运算实现交换两个数的值

    交换两个数的值,通常用利用一个变量来交换数值,异或交换两个数的值是资源开销最小的方法,不需要中介数,原理简单的来说就是异或的负负得正
    2018-09-09
  • C++11 shared_ptr 与 make_shared源码剖析详解

    C++11 shared_ptr 与 make_shared源码剖析详解

    这篇文章主要介绍了C++11 shared_ptr 与 make_shared的源码剖析,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C++抽象基类讲解

    C++抽象基类讲解

    这篇文章主要介绍了C++抽象基类讲解,象基类abstract base class简称ABC,C++实现继承的时候,需要保证派生类和基类之间是一种is-a的关系。在大多数时刻,这样的关系是没有问题的,然而在一些特殊的情况可能会遇到问题,下面来看看文章的具体介绍吧
    2022-01-01
  • Qt图形图像开发之QT滚动区控件(滚动条)QScrollArea的详细方法用法图解与实例

    Qt图形图像开发之QT滚动区控件(滚动条)QScrollArea的详细方法用法图解与实例

    这篇文章主要介绍了Qt图形图像开发,QT滚动区控件(滚动条)QScrollArea的详细方法用法图解与实例,需要的朋友可以参考下
    2020-03-03
  • C中实现矩阵乘法的一种高效的方法

    C中实现矩阵乘法的一种高效的方法

    本篇文章介绍了,在C中实现矩阵乘法的一种高效的方法。需要的朋友参考下
    2013-05-05

最新评论