2011-10-27 299 views
5

我有一个自定义小部件来模拟气球提示。为了正确显示,该部件取决于QWidget属性Qt::WA_TranslucentBackground。我的应用程序应该可以在所有主流平台(Windows XP,Windows 7,Linux,Mac)上运行,所以我担心一点:所有主流平台上都有这个属性吗?如果不是,我可以查询它是否是? testAttribute()不这样做。它只返回属性是否已设置,而不是设置是否有效。Qt :: WA_TranslucentBackground随处可用?

回答

6

如果配置为不支持ARGB,这应该与Linux上超过X11的唯一例外一起使用。请参阅QWidget文档:

创建半透明窗口

由于Qt的4.5,它已经可以创建在支持合成窗口系统半透明 地区的窗口。

为了能够在顶级部件此功能,请将其 的Qt :: WA_TranslucentBackground属性的setAttribute用(),并确保 其背景是在 你想成为部分透明的区域涂上非不透明的颜色。

平台说明:

X11:此功能依赖于使用支持ARGB视觉效果和复合窗口管理器的X服务器。

Windows:窗口小部件需要设置Qt :: FramelessWindowHint窗口标志以使半透明工作。

考虑阅读标题为“透明度和双缓冲”的段落,可能会很有趣。

+0

当代Linux不支持ARGB有多常见或罕见?我可以以某种方式查询它吗? –

+0

我不认为你会遇到与最近的硬件/分布有关的问题。无论如何,您应该通过使用xdpyinfo或查看配置文件xorg.conf来获取信息。也许你可能会遇到嵌入式Linux系统的一些问题。这给了更多的东西:http://stackoverflow.com/questions/2434511/what-pixel-format-does-x-server-use。 –

7

对于Linux,你应该检查是否合成启用:

bool QX11Info::isCompositingManagerRunning() [static] 

例如

#ifdef Q_WS_X11 
    if(QX11Info::isCompositingManagerRunning()) 
     setAttribute(Qt::WA_TranslucentBackground); 
#endif 

这个问题很旧,但这可能有助于某人。

+1

而对于任何一个在谷歌中徘徊的人,如果你发现自己需要支持非合成桌面,例如四舍五入的OSD或演讲气球弹出窗口,Qt [ShapedClock](https://doc.qt.io/ qt-5/qtwidgets-widgets-shapedclock-example.html)示例演示如何使用'setMask'生成非方形窗口而不进行合成。 – ssokolow

+0

请注意,有时为了让'Qt :: WA_TranslucentBackground'在没有'setMask'的linux下工作,你还必须启用一些属性和一个窗口标志。 https://stackoverflow.com/a/30596357/999943 – phyatt