一个自定义QMainWindow,设置了无边框窗口后,
setWindowFlag(Qt::FramelessWindowHint);
再全屏显示:
showMaximized();
之后窗口就无法还原了,无论是调用:
setWindowState(Qt::WindowNoState);
showNormal();
还是调用:
setWindowState(Qt::WindowNoState);
setFixedSize(800, 600);
都不能改变窗口的大小。
如果是调试状态,你会在应用输出窗口,看到这么一段话:
QWindowsWindow::setGeometry: Unable to set geometry 1200x900+0+0 (frame: 1200x900+0+0) on QWidgetWindow/"MarkImageClassWindow" on "PHL 328P6VU". Resulting geometry: 3840x2114+0+0 (frame: 3840x2114+0+0) margins: 0, 0, 0, 0)
这是 Qt 在无边框窗口 (Qt::FramelessWindowHint) 下的一个已知问题。无边框窗口在 showMaximized() 后,由于缺少标准的窗口管理机制,Qt 无法正确地恢复窗口大小 。
下面是解决方案:
if (win->isMaximized()) {
win->setWindowFlags(windowFlags() & ~Qt::FramelessWindowHint);
win->setWindowState(Qt::WindowNoState);
QTimer::singleShot(60, [win]() {
win->setFixedSize(800, 600);
win->setWindowFlags(Qt::FramelessWindowHint);
auto screenRect = win->screen()->geometry();
int x = (screenRect.width() - win->width()) / 2 + screenRect.x();
int y = (screenRect.height() - win->height()) / 2 + screenRect.y();
win->move(x, y);
win->show();
});
}
此方案原理就是把窗口的FramelessWindowHint属性拿掉,再改变窗口的大小,再把FramelessWindowHint窗口属性加回去。
值得注意的是,setWindowFlags() 之后需要 show() 以应用更改,否则窗口可能不会更新。