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窗口绘制阴影内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • OpenCV+Qt实现图像处理操作工具的示例代码

    OpenCV+Qt实现图像处理操作工具的示例代码

    这篇文章主要介绍了利用OpenCV+Qt实现图像处理操作工具,可以实现雪花屏、高斯模糊、中值滤波、毛玻璃等操作,感兴趣的可以了解一下
    2022-08-08
  • C++常用函数之XML JSON格式转换问题

    C++常用函数之XML JSON格式转换问题

    XML在Json出现前应用很广泛,灵活性好,应用语言也没有限制,发展了这么长时间后xml标准已经很臃肿。这篇文章主要介绍了C++常用函数之XML JSON格式转换问题,需要的朋友可以参考下
    2020-02-02
  • 你真的知道C++对象大小吗?

    你真的知道C++对象大小吗?

    这篇文章主要给大家介绍了关于C++对象大小的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 在C++中如何阻止类被继承详解

    在C++中如何阻止类被继承详解

    这篇文章主要介绍了在C++中如何阻止类被继承,对于C++初学者而言可以通过本文实例更好的理解类的原理及运用,需要的朋友可以参考下
    2021-09-09
  • C++算术运算符与类型转换

    C++算术运算符与类型转换

    这篇文章主要介绍了C++算术运算符与类型转换,C++当中提供5种基础的算术运算符,分别是加法、减法、乘法、除法和取模。下main我们就一起来看看下面文章得具体举例与说明,需要的朋友可以参考一下,希望对你有所帮助
    2021-11-11
  • 详解C++11中的线程锁和条件变量

    详解C++11中的线程锁和条件变量

    C++ 11允许开发者们以标准的、不依赖于平台的方式编写多线程程序。这篇文章概述了标准库对于线程和同步操作机制的支持。这些都是非常重要的知识,希望读者们可以认真看一下
    2021-06-06
  • C++数据结构链表基本操作示例过程

    C++数据结构链表基本操作示例过程

    这篇文章主要为大家介绍了C++数据结构链表基本操作的示例过程有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-11-11
  • C语言栈顺序结构实现代码

    C语言栈顺序结构实现代码

    一个能够自动扩容的顺序结构的栈 ArrStack 实例 (GCC编译),有需要的朋友可以参考一下
    2013-10-10
  • C/C++ Qt MdiArea 多窗体组件应用教程

    C/C++ Qt MdiArea 多窗体组件应用教程

    MDI窗体控件类似于画布,该控件只具备展示窗体的功能,无法实现生成窗体,所以我们需要在项目中手动增加自定义的Dialog对话框,并对该对话框进行一定的定制,这篇文章主要介绍了C/C++ Qt MdiArea 多窗体组件应用,需要的朋友可以参考下
    2021-12-12
  • QT实现年会抽奖小软件的示例代码

    QT实现年会抽奖小软件的示例代码

    本文主要介绍了QT实现年会抽奖小软件的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01

最新评论