Qt_阴影效果

简介:

一、控件阴影效果

为子部件添加阴影比较简单,使用如下方式:

1
2
3
4
5
6
7
8
9
QGraphicsDropShadowEffect *shadow_effect =  new  QGraphicsDropShadowEffect( this );
 
shadow_effect->setOffset(-5, 5);
 
shadow_effect->setColor(Qt::gray);
 
shadow_effect->setBlurRadius(8);
 
network_group_box->setGraphicsEffect(shadow_effect);

    效果如下:

Qt之再谈阴影边框

二、 窗口阴影效果(代码实现)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void  DropShadowWidget::paintEvent(QPaintEvent * event )
{
 
     QPainterPath path;
     path.setFillRule(Qt::WindingFill);
     path.addRect(10, 10,  this ->width()-20,  this ->height()-20);
     QPainter painter( this );
     painter.setRenderHint(QPainter::Antialiasing,  true );
     painter.fillPath(path, QBrush(Qt::white));
 
     QColor color(0, 0, 0, 50);
     for ( int  i=0; i<10; i++)
     {
         QPainterPath path;
         path.setFillRule(Qt::WindingFill);
         path.addRect(10-i, 10-i,  this ->width()-(10-i)*2,  this ->height()-(10-i)*2);
         color.setAlpha(150 - qSqrt(i)*50);
         painter.setPen(color);
         painter.drawPath(path);
     }
}

  三、窗口阴影效果(图片绘制)

 阴影边框很常见,诸如360以及其他很多软件都有类似效果,了解CSS3的同学们应该都知道box-shadow,它就是来设定阴影效果的,那么Qt呢?看过一些资料,说是QSS是基于CSS2的,既然如此,box-shadow是基于CSS3的!那么Qt定然就用不了!

  搜了一些资料,每张图片都做成阴影效果的固然不可能,直接舍弃(即使可以,也不采纳)。如果实时的去画图,效率太低,最后选择了拼图的方式!
Qt之阴影边框
  效果如下:
   Qt之阴影边框
Qt之阴影边框
  左上角、左下角、右上角、右下角、上、下、左、右,这几个方向都绘制对应的图即可!
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "shadow_widget.h"
 
ShadowWidget::ShadowWidget(QWidget *parent)
    : QDialog(parent)
{
    setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
    setAttribute(Qt::WA_TranslucentBackground);
}
ShadowWidget::~ShadowWidget()
{
}
void  ShadowWidget::paintEvent(QPaintEvent * event )
{
    QPainter painter( this );
    this ->drawShadow(painter);
    painter.setPen(Qt::NoPen);
    painter.setBrush(Qt::white);
    painter.drawRect(QRect(SHADOW_WIDTH, SHADOW_WIDTH,  this ->width()-2*SHADOW_WIDTH,  this ->height()-2*SHADOW_WIDTH));
}
void  ShadowWidget::drawShadow(QPainter &painter)
{
    //绘制左上角、左下角、右上角、右下角、上、下、左、右边框
    QList pixmaps;
    pixmaps.append(QPixmap( ":/shadow/shadow_left" ));
    pixmaps.append(QPixmap( ":/shadow/shadow_right" ));
    pixmaps.append(QPixmap( ":/shadow/shadow_top" ));
    pixmaps.append(QPixmap( ":/shadow/shadow_bottom" ));
    pixmaps.append(QPixmap( ":/shadow/shadow_left_top" ));
    pixmaps.append(QPixmap( ":/shadow/shadow_right_top" ));
    pixmaps.append(QPixmap( ":/shadow/shadow_left_bottom" ));
    pixmaps.append(QPixmap( ":/shadow/shadow_right_bottom" ));
    painter.drawPixmap(0, 0, SHADOW_WIDTH, SHADOW_WIDTH, pixmaps[4]);
    painter.drawPixmap( this ->width()-SHADOW_WIDTH, 0, SHADOW_WIDTH, SHADOW_WIDTH, pixmaps[5]);
    painter.drawPixmap(0, this ->height()-SHADOW_WIDTH, SHADOW_WIDTH, SHADOW_WIDTH, pixmaps[6]);
    painter.drawPixmap( this ->width()-SHADOW_WIDTH,  this ->height()-SHADOW_WIDTH, SHADOW_WIDTH, SHADOW_WIDTH, pixmaps[7]);
    painter.drawPixmap(0, SHADOW_WIDTH, SHADOW_WIDTH,  this ->height()-2*SHADOW_WIDTH, pixmaps[0].scaled(SHADOW_WIDTH,  this ->height()-2*SHADOW_WIDTH));
    painter.drawPixmap( this ->width()-SHADOW_WIDTH, SHADOW_WIDTH, SHADOW_WIDTH,  this ->height()-2*SHADOW_WIDTH, pixmaps[1].scaled(SHADOW_WIDTH,  this ->height()- 2*SHADOW_WIDTH));
    painter.drawPixmap(SHADOW_WIDTH, 0,  this ->width()-2*SHADOW_WIDTH, SHADOW_WIDTH, pixmaps[2].scaled( this ->width()-2*SHADOW_WIDTH, SHADOW_WIDTH));
    painter.drawPixmap(SHADOW_WIDTH,  this ->height()-SHADOW_WIDTH,  this ->width()-2*SHADOW_WIDTH, SHADOW_WIDTH, pixmaps[3].scaled( this ->width()-2*SHADOW_WIDTH, SHADOW_WIDTH));
 
}

  


本文转自夜&枫博客园博客,原文链接:http://www.cnblogs.com/newstart/p/3365455.html,如需转载请自行联系原作者

相关文章
Qt无边框窗口拖拽和阴影
无边框窗口的实现
430 0
Qt无边框窗口拖拽和阴影
|
4月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
181 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
3月前
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
88 0
|
2月前
|
开发工具 C++
qt开发技巧与三个问题点
本文介绍了三个Qt开发中的常见问题及其解决方法,并提供了一些实用的开发技巧。
|
2月前
|
3月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
153 2
Qt开发网络嗅探器02
Qt开发网络嗅探器02
|
3月前
|
存储 运维 监控
Qt开发网络嗅探器01
Qt开发网络嗅探器01
|
3月前
|
网络协议 容器
Qt开发网络嗅探器03
Qt开发网络嗅探器03