首页 > 其他分享 >Qt给一个形状添加外发光的效果

Qt给一个形状添加外发光的效果

时间:2023-07-06 11:36:59浏览次数:43  
标签:控件 Qt 32 模糊 painter1 添加 发光 QPointF

我们知道给控件添加特效可以使用QGraphicsEffect类。但是如果不针对整个控件而只是针对控件内的某个元素怎么添加外发光效果呢?比如说我在控件内绘制一个六边形,要给这个六边形添加外发光效果。一般的做法是先对六边形模糊一下,然后先绘制模糊的六边形再在其上叠加绘制原始六边形。绘制多边形QPainter类有这个功能。因此主要问题就是实现模糊效果,对此Qt是没有直接提供这个功能的,想实现这个功能需要自己写。解决方案可以有:

  1. 自己实现一个模糊函数,或借助图像处理库实现模糊函数。
  2. Qt中有一个名为qt_blurImage(...)的函数可以模糊图片,但是它没有对开发者公开。有兴趣的可以搜一下这个函数。
  3. QGraphicsItem也可以添加QGraphicsEffect特效。所以可以用Qt的QGraphicsScene的render(...)函数将其中添加了模糊特效的QGraphicsItem转成QPixmap,然后作为位图绘制。注意这里不能直接用QGraphicsItem的paint函数输出位图,因为paint函数输出不了特效。

既然使用了Qt,那就尽量全用Qt实现。所以本文主要讨论第3种方法。用QGraphicsScene实现形状模糊化。模糊函数如下。以下代码的开发环境是VS2017和Qt5.9:

const QPointF MOscil::markerPoly[] = /* 一个箭头 */
{
    QPointF(3.464101, 2.0), QPointF(2.338268, 2.65),
    QPointF(3.338268, 4.382051), QPointF(2.125833, 5.082051),
    QPointF(1.125833, 3.35), QPointF(0, 4.0),
    QPointF(0, 0), 
};

...

void MOscil::obtainBlurPoly(qreal radius, QPixmap& map)
{
    QPixmap map1(32, 32);
    map1.fill(Qt::transparent);
    QPainter painter1(&map1);
    painter1.setPen(Qt::NoPen);
    painter1.setBrush(Qt::blue);
    painter1.translate(4, 4); /* 注意这里偏移4像素,留白 */
    painter1.scale(4, 4);
    painter1.drawPolygon(markerPoly, 7);

    QPixmap map2(32, 32);
    map2.fill(Qt::transparent);
    QPainter painter2(&map2);
    QGraphicsPixmapItem *pxItem = new QGraphicsPixmapItem;
    pxItem->setPixmap(map1);
    QGraphicsBlurEffect* blur = new QGraphicsBlurEffect;
    blur->setBlurRadius(radius);
    pxItem->setGraphicsEffect(blur);
    QGraphicsScene scene;
    scene.addItem(pxItem);
    scene.render(&painter2);
    map = std::move(map2);
}

上述代码中的MOscil类是我自定义的一个用于显示波形图的类。它来自我的博文“自定义的Qt仿示波器控件”但有较大改动。其中markerPoly数组表示的是一个大约6×6的箭头,在绘制中我们把它放大了4倍并且居中放置。用32×32的位图装它完全装得下。下面是显示效果截图:

上图是黄色箭头,蓝色外发光。基本方法就是这样。

标签:控件,Qt,32,模糊,painter1,添加,发光,QPointF
From: https://www.cnblogs.com/mengxiangdu/p/17531631.html

相关文章

  • C/C++ Qt 数据库SqlRelationalTable关联表
    在上一篇博文中详细介绍了SqlTableModle组件是如何使用的,本篇博文将介绍SqlRelationalTable关联表组件,该组件其实是SqlTableModle组件的扩展类,SqlRelationalTable组件可以关联某个主表中的外键,例如将主表中的某个字段与附加表中的特定字段相关联起来,QSqlRelation(关联表名,关联ID,......
  • Qt防止程序重复运行
    1.使用共享内存的方法 弊端:使用共享内存方式,当第二个进程启动时,判断内存区数据是否建立,如有,则退出;这种方式有弊端,在程序发生崩溃时,未及时清除共享区数据,导致程序不能正常启动。参考:qt之使程序只运行一个实例,若再次点击exe则将已运行的实例置在最顶层显示_大桶矿泉水......
  • .NET 个人博客-给图片添加水印
    个人博客-给图片添加水印前言......
  • 十、添加资源文件和使用样式
    1、添加资源文件(.qrc文件)1.1创建项目并打开项目1.2Ctrl+n创建新文件,选择“QT”文件下边的“QtResourceFile”。 1.3输入文件名和选择保存路径1.4将需要添加的资源文件复制到项目目录下1.5导入资源文件到Qt项目中1.5.1 为资源文件添加前缀(类似于文件夹) 1.5.2......
  • Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
    https://blog.csdn.net/qq_21438461/article/details/130764349Linux系统编程C/C++以及Qt中的零拷贝技术:从底层原理到高级应用一、零拷贝技术的概念与价值(Zero-CopyConceptandValue)1.1什么是零拷贝(WhatisZero-Copy)1.2为什么我们需要零拷贝(WhyWeNeedZero-C......
  • 如何在qt中使用gdal?
    首先是使用MinGW编译的GDAL库,这种貌似比较少见。。可见大家都还是喜欢用vs来编译https://zhuanlan.zhihu.com/p/355864559参考:https://blog.csdn.net/qq_32629895/article/details/105738977(介绍一种简单的在QT(MinGW)中使用gdal的方法)......
  • QT 记Sqlite用法
    一、在.pro文件添加QT+=coreguisql二、头文件#include<QSqlDatabase>#include<QSqlError>#include<QSqlQuery> 三、用法1//以写的查询为例2QSqlDatabasedb=QSqlDatabase::addDatabase("QSQLITE");34db.setDatabaseNa......
  • QT 记串口的用法
    QSerialPort用法一、在.pro文件添加serialportQT+=coreguiserialport二、头文件#include<QSerialPort>#include<QSerialPortInfo>三、开启串口1voidWidget::on_pushButton_clicked()//自己写的按钮为例2{3QSerialPortInfoinfo;4QLis......
  • 直播软件搭建,生成二维码及添加logo
    直播软件搭建,生成二维码及添加logo  @Override  publicBitmapgenerateBitmap(Stringcontent,intwidth,intheight){    QRCodeWriterqrCodeWriter=newQRCodeWriter();    Map<EncodeHintType,String>hints=newHashMap<>();    h......
  • 常用 QT 样式与方法(按钮悬浮变色,渐变色等)
    1QSS按钮悬浮效果类似于企业微信等,鼠标悬浮在某按钮上,按钮会改变背景色来达到告知用户"选中"的效果,如下图所示:可以看到其实是background有一个浅灰色,同理,我们可以在hover的时候改变按钮的background如企业微信这样的作法,或者更改按钮文字颜色。主要使用的QT函数,示......