怎样实现QT3控件的背景为透明?

来源:互联网 发布:windows 没有ssh目录 编辑:程序博客网 时间:2024/04/28 01:46

首先声明:下面的内容并没有最终解决背景透明的问题,只是把我尝试的过程写下来。所以想找到答案的人就不要往下看了。

 

我的环境是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方法,估计透明效果做出来页面也会非常闪烁。因为不能换开发环境,所以考虑放弃透明背景,换成给空间背景上颜色吧。

原创粉丝点击