標籤:
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 的狀態列視窗就是這樣子,滑鼠可以切換功能,但IME的各個狀態依然是輸入焦點視窗而非 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
QT視窗置頂/真透明/背景模糊/非矩形/跳過工作列分頁器/無邊框/無焦點點擊/焦點穿透