怎样实现QT3控件的背景为透明?
2010-01-13 13:19
218 查看
首先声明:下面的内容并没有最终解决背景透明的问题,只是把我尝试的过程写下来。所以想找到答案的人就不要往下看了。
我的环境是qt3.3.8+fedora8。
在做一个程序里面用到QIconView,想让它的背景色跟主窗口的背景图片(不是纯色的)一致,但是发现当拖动滚动条之后,发现背景图片并没有刷新,刷新了闪烁有很严重,所以想把它做成背景透明的,但是我试过很久,很多种办法都没能成功,现在能想起来的有以下几种:
(1)可以给widget设成其parent一样的背景图片,并且是widget所在位置的部分图片,这样在widget不会移动的情况下是透视的效果。但是貌似QIconView不支持,我的工程里用到这个控件。
setBackgroundOrigin(ParentOrigin);
除ParentOrigin外还有:WidgetOrigin (the default), ParentOrigin, WindowOrigin or AncestorOrigin
(2)试过stylesheet,可是这好像是qt4才开始用的,我用的是qt3.3.8
setStyleSheet("background-color: rgba(255, 255, 0, 50%)");
(3)试过QWidget::setWindowQpecity(double)是设置控件透明度的。但是参考手册上好像说这个只支持Mac和windows系统:This feature is only present on Mac OS X and Windows 2000 and up。我用的是fedora8,而且在程序里试过,确实不好使
(4)试过给背景图设成一个纯透明的png图片(记得在哪里这样做过),可是底色变成白色,仍然不是透明的;
(5)在参考手册里查到enum BGMode { TransparentMode, OpaqueMode },但是不知道怎么使用
(6)在网上也查到这样的用法,但是经过测试,貌似仍然是qt4的用法,qt3不支持:
QPalette pal = this->palette();
pal.setBrush(QPalette::Base, Qt::transparent);
this->setPalette(pal);
换成qt3支持的语法,效果跟(4)一样:
QPalette pal = wordLabel->palette();
const QBrush *br = new QBrush(color0, QPixmap("images/transground.png"));
pal.setBrush(QColorGroup::Background , *br);
wordLabel->setPalette(pal);
现在的问题是:
(1)qt3支持透明背景吗,指linux系统下?
(2)如果支持如何实现?
(3)我似乎在哪里看过在paintEvent里自己一帧一帧地画背景,但是想不起来在哪看到的了。这样是否能实现透明背景?如何实现?
(4)我尝试过把QIconViewItem的icon属性设成一个透明的png图片,这样的效果就是透明的,为什么呢?能否借鉴呢?
(5)QIconView为什么不支持setBackgroundOrigin(ParentOrigin);呢?
后续:
在网上得到一个回答如下:
需要重载label的paint方法,设置label的mask等等,甚至可能需要grab被遮挡的widget的图像,效率非常低,并且被遮挡的widget一定不能是动态改变的图形输出,要不在我的双核pc上跑都感觉的到卡,这点我记得相当清楚。
所以建议换到qt4,默认就是透明的。
按照上面说的,要重载paint方法,估计透明效果做出来页面也会非常闪烁。因为不能换开发环境,所以考虑放弃透明背景,换成给空间背景上颜色吧。
我的环境是qt3.3.8+fedora8。
在做一个程序里面用到QIconView,想让它的背景色跟主窗口的背景图片(不是纯色的)一致,但是发现当拖动滚动条之后,发现背景图片并没有刷新,刷新了闪烁有很严重,所以想把它做成背景透明的,但是我试过很久,很多种办法都没能成功,现在能想起来的有以下几种:
(1)可以给widget设成其parent一样的背景图片,并且是widget所在位置的部分图片,这样在widget不会移动的情况下是透视的效果。但是貌似QIconView不支持,我的工程里用到这个控件。
setBackgroundOrigin(ParentOrigin);
除ParentOrigin外还有:WidgetOrigin (the default), ParentOrigin, WindowOrigin or AncestorOrigin
(2)试过stylesheet,可是这好像是qt4才开始用的,我用的是qt3.3.8
setStyleSheet("background-color: rgba(255, 255, 0, 50%)");
(3)试过QWidget::setWindowQpecity(double)是设置控件透明度的。但是参考手册上好像说这个只支持Mac和windows系统:This feature is only present on Mac OS X and Windows 2000 and up。我用的是fedora8,而且在程序里试过,确实不好使
(4)试过给背景图设成一个纯透明的png图片(记得在哪里这样做过),可是底色变成白色,仍然不是透明的;
(5)在参考手册里查到enum BGMode { TransparentMode, OpaqueMode },但是不知道怎么使用
(6)在网上也查到这样的用法,但是经过测试,貌似仍然是qt4的用法,qt3不支持:
QPalette pal = this->palette();
pal.setBrush(QPalette::Base, Qt::transparent);
this->setPalette(pal);
换成qt3支持的语法,效果跟(4)一样:
QPalette pal = wordLabel->palette();
const QBrush *br = new QBrush(color0, QPixmap("images/transground.png"));
pal.setBrush(QColorGroup::Background , *br);
wordLabel->setPalette(pal);
现在的问题是:
(1)qt3支持透明背景吗,指linux系统下?
(2)如果支持如何实现?
(3)我似乎在哪里看过在paintEvent里自己一帧一帧地画背景,但是想不起来在哪看到的了。这样是否能实现透明背景?如何实现?
(4)我尝试过把QIconViewItem的icon属性设成一个透明的png图片,这样的效果就是透明的,为什么呢?能否借鉴呢?
(5)QIconView为什么不支持setBackgroundOrigin(ParentOrigin);呢?
后续:
在网上得到一个回答如下:
需要重载label的paint方法,设置label的mask等等,甚至可能需要grab被遮挡的widget的图像,效率非常低,并且被遮挡的widget一定不能是动态改变的图形输出,要不在我的双核pc上跑都感觉的到卡,这点我记得相当清楚。
所以建议换到qt4,默认就是透明的。
按照上面说的,要重载paint方法,估计透明效果做出来页面也会非常闪烁。因为不能换开发环境,所以考虑放弃透明背景,换成给空间背景上颜色吧。
相关文章推荐
- 实现对话框在位图作为背景时的控件透明
- MFC实现背景透明,控件不透明的对话框,且点击图片有事件响应
- 实现控件的透明背景
- C#怎样实现窗体透明而控件不透明,或者就是怎样无窗体显示图片,就像圣诞那样的程序,不吝赐教!
- 实现控件的透明背景
- 我想在透明的panel里滚动文本! 主要是想透明滚动,看到下面的控件! 怎样实现!
- MFC中实现Static控件背景透明
- 实现对话框在位图作为背景时的控件透明
- MFC一一添加背景图片并让控件实现透明的
- 在Vb.net中实现透明控件背景
- 实现控件背景透明的几种方法
- 实现控件透明背景的几种方案
- QT 实现子控件的透明,可以实现主窗口设置背景皮肤
- PNG透明背景按钮的实现(MFC)
- java swing中常用的控件设置为背景透明的栗子
- VC static控件背景如何设置成透明
- wince(windows mobile) 中win32 实现带透明背景的贴图按钮
- div+css实现背景透明
- CSS实现背景透明,文字不透明(各浏览器兼容)
- 如何使STATIC控件的背景透明以及动态改变控件文本内容时闪烁的问题