1. 程式人生 > >QT 無邊框窗體最大化 遮擋windows工作列的問題

QT 無邊框窗體最大化 遮擋windows工作列的問題

最近寫的一個基於QT的程式的UI,要求整個窗體的風格渾然一體。包括窗體的邊框什麼的。這個其實定義了QSS啥的就沒什麼複雜的了,純粹體力活了。但是如果想整體制定一個窗體的話就需要讓窗體的屬性是無邊框(frameless)的。只有這樣才能徹底的脫離windows的窗體管理器。才能使用自己的標題欄(好像大家現在都流行自定義標題欄哈)。

但是問題來了。frameless的窗體在最大化後會將windows的工作列給遮擋住,這個是我們不想要的。畢竟咱這個不是遊戲,還是得留著工作列的。後來琢磨了半天也沒想到啥好方法,後來看到Nokia的Ovi套件的窗體,頓時發現就是我想要的style啊。沒有邊框,但是自定義的標題欄。最大化還不遮擋taskbar。本著別人能做出來俺也能做出來的想法。繼續琢磨。先用spy++看了下他的窗體flags,看看是不是有啥貓膩。發現木有,人家就是一個frameless的wiget。成了,這下踏實了自己琢磨吧。之後想到了下面的這個方法

最直接的想法肯定是用win32 api去查詢taskbar的位置,然後設定自己窗體的正確位置。這個就帶來一個最鬱悶的問題,這玩意沒法跨平臺了。幾經翻閱qt的手冊。發現QT確實還是挺偉大的。有這麼個函式

const QRect QDesktopWidget::availableGeometry ( int screen = -1 ) const

Returns the available geometry of the screen with index screen. What is available will be subrect of screenGeometry() based on what the platform decides is available (for example excludes the dock and menu bar on Mac OS X, or the task bar on Windows). The default screen is used if screen

 is -1.

大概意思就是能得到目前screen上能夠使用的最大尺寸(當然已經拋去了taskbar了)。這下美了,不但不用自己寫了還跨平臺了。

不但跨平臺了,還支援多顯示器了。不得不讚嘆qt還是挺生猛的。這下只要最大化的時候直接使用這個尺寸設定自己的窗體就OK。