Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2195613
  • 博文数量: 866
  • 博客积分: 14125
  • 博客等级: 上将
  • 技术积分: 10638
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-27 16:53
个人简介

https://github.com/landuochong

文章分类

全部博文(866)

文章存档

2019年(3)

2018年(1)

2017年(10)

2015年(3)

2014年(8)

2013年(3)

2012年(70)

2011年(103)

2010年(360)

2009年(283)

2008年(22)

分类: C/C++

2009-08-06 15:15:10

在前面的帖子里, 笔者给出了一个制作整体透明而控件不透明的Qt实例。 刚好昨天在qtcn论坛里看到有人问到怎么实现主体不透明而控件是透明的效果(http://www.qtcn.org/bbs/read.php?tid=19368), 其实用TranslucentBackground稍加改动即可实现。  笔者写了一个类似镜框效果的小程序, 外面是个彩色边框, 中间是完全透明的镜子。 镜子的位置是一个很普通的QWidget, 当然可以替换成其他任何的控件。
截图如下:

full2

full1

下面就详细讲述一下实现的思路:

上篇文章里我们讨论了对窗体整体使用setAttribute(Qt::WA_TranslucentBackground)而局部控件设置setAttribute(Qt::WA_TranslucentBackground, false)可以实现整体透明局部不透明的效果。 要想实现相反的效果, 首先我们必须明确, 控件要想透明, 必须控件及其背景(包括作为背景的widget)都要透明才可以, 所以我们要保留程序整体的translucent属性。  这样其实我们的“整体不透明”是个假像, 要靠我们在顶层窗体的paintEvent里填充底色来实现, 这是第一个实现的要点。

第二点, 如果填充了背景色, 那么控件对应的背景就变成不透明的了, 那么我们的控件也无法透明。 所以这就用到第二个技术, 在填充底色时要避开控件所在的区域, 方法是用QRegion类计算整体减去局部的区域, 然后用QPainterPath勾勒该区域再用fillPath填充。

第三点, 这一点笔者还没找到什么好的简单方法来实现, 请大家开动脑筋想想办法。 问题是如果有不规则外缘的控件该怎么处理呢? 特别是像由style控制的控件外观, 比如圆形边角的按钮等等, 它的控件区域难以计算, 怎么能确定准确的区域呢? 如果大家有好方法记得留言给我。

例子程序中还练习使用了前面一篇blog介绍的截屏的方法,大家有兴趣顺便试一下吧。blog文在:
http://www.cuteqt.com/blog/?p=347

例子源码下载: transparent1.tar.gz

阅读(1412) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册