最近使用QT做项目时遇到了一个问题,就是QT无边框窗口最大化时会遮盖Windows的任务栏及引起其他UI显示问题(我的环境是Win10,之前使用Win7时没遇到),于是去找度娘,看了几个网友写的文章,都提到了下述接口:
//获取屏幕可用最大尺寸
1. const QRect QDesktopWidget::availableGeometry ( int screen = -1 ) const
// 设置窗口大小及位置
2. void QWidget::setGeometry(const QRect &)
有网友建议用setGeometry(QApplication::desktop()->availableGeometry()),使用该方法可以实现最大化的目的,但是需要额外的逻辑记录窗口状态、处理窗口还原逻辑、处理最大化时禁止鼠标拖拽改变窗口大小等等,个人觉得有些麻烦!
以下为我当前使用的方法,通过捕获Windows WM_GETMINMAXINFO消息重新设置窗口最大化时窗口的大小,以解决遮盖任务栏的问题,正常使用showMaximized()、showNormal()进行窗口最大化/还原操作,而不需要使用setGeometry设置窗口大小,不需要额外处理窗口状态等逻辑,代码如下:
bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
MSG* msg = reinterpret_cast<MSG*>(message);
switch (msg->message)
{
case WM_GETMINMAXINFO:
{
//解决QT无边框窗体最大化遮盖Windows任务栏问题
if (this->isMaximized())
{
int index = QApplication::desktop()->screenNumber(this);
const QRect rc = QApplication::desktop()->availableGeometry(index);
MINMAXINFO* p = (MINMAXINFO*)(msg->lParam);
p->ptMaxPosition.x = 0;
p->ptMaxPosition.y = 0;
p->ptMaxSize.x = rc.width();
p->ptMaxSize.y = rc.height();
*result = ::DefWindowProc(msg->hwnd, msg->message, msg->wParam, msg->lParam);
return true;
}
}
}
return QMainWindow::nativeEvent(eventType, message, result);
}
WM_GETMINMAXINFO、MINMAXINFO等知识点请自行百度,这里不做赘述!
代码仅作参考!