2011-10-27 295 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