您的位置:首页 > 编程语言 > Qt开发

怎样实现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方法,估计透明效果做出来页面也会非常闪烁。因为不能换开发环境,所以考虑放弃透明背景,换成给空间背景上颜色吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息