QT窗口置頂/真透明/背景模糊/非矩形/跳過任務欄分頁器/無邊框/無焦點點擊/焦點穿透


qt 窗口置頂/真透明/背景模糊/非矩形/跳過任務欄分頁器/無邊框/無焦點點擊/焦點穿透


窗口置頂
qt 里是 setWindowFlags(Qt::WindowStaysOnTopHint)
kde 里是 KWindowSystem::setState(winId(), NET::KeepAbove)
這樣的置頂窗口不會處於全屏窗口的上方,如果需要真正的置頂,setWindowFlags(Qt::X11BypassWindowManagerHint) 可無視這個規則,但這樣不會出現任務欄等,kimtoy 的預編輯窗口就是真正的置頂。

真透明

qt 里是 setAttribute(Qt::WA_TranslucentBackground, true)
真透明需要窗口管理器開啟混成,否則透明區域將顯示為黑色,這時候可以用非矩形來摳去黑色區域。


背景模糊

kde 擴展 Plasma::WindowEffects::enableBlurBehind(winId(), true, /*這里有個參數指定模糊區域*/)
背景模糊需要窗口管理器開啟模糊特效,否則無效。kde kwin 的擴展標識,其它桌面上可能沒有模糊效果。


非矩形

qt 里是 setMask(/*這里有個參數指定非矩形區域*/)
沒有開桌面混成的時候達到沒有黑色區域的效果,形狀復雜的話相當消耗資源,使用非透明區域作為形狀會產生邊緣鋸齒。


跳過任務欄分頁器
kde 里是 KWindowSystem::setState(winId(), NET::SkipTaskbar | NET::SkipPager)
這樣的窗口經過隱藏再顯示出來時,如果程序其它對話框彈出,原先設置跳過任務欄分頁器的窗口將失效。解決辦法是實現 showEvent(QShowEvent* event) 中再次調用一下。kimtoy 的狀態欄窗口在彈出關於kimtoy對話框或者設置對話框后就不能跳過任務欄分頁器的,即通過此法解決,krunner也是這樣的。


無邊框
qt 里是 setWindowFlags(Qt::FramelessWindowHint)
實際上只要能獲得焦點,ctrl+f3 打開kwin的菜單還能還原的哦,比如krunner,很多plasmiod。。


無焦點點擊

qt 里是 setAttribute(Qt::WA_X11DoNotAcceptFocus, true)
無焦點點擊的意思是用鼠標在窗口上進行操作而不將鍵盤輸入的焦點轉移到窗口中。kimtoy 的狀態欄窗口就是這樣子,鼠標可以切換功能,但輸入法的各個狀態依然是輸入焦點窗口而非 kimtoy 狀態欄窗口的,這樣可實現真正的 Dock。


焦點穿透
很遺憾qt沒有這個函數只好直接用x11shape的 XShapeCombineRectangles(QX11Info::display(), winId(), ShapeInput, 0, 0, NULL, 0, ShapeSet, YXBanded)

焦點穿透的意思是所有鼠標鍵盤操作全部會穿透窗口到下方窗口。有個 Qt::WA_TransparentForMouseEvents 可以對子部件實現,而窗口本身不行。kimtoy 沒用到這個,不過很多 osd 桌面歌詞程序經常用,網上找了下只有 gdk 的實現,於是就把 qt 的寫在這里啦。

本文章轉自http://blog.csdn.net/outmanlee/article/details/7451097


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM