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。

你可能感兴趣的:(技术原创)