mac 下解决Qt::FramelessWindowHint 在 qt 5.12.1 , xcode 12 无法缩小的一种解决方案

为了显示效果, 我们经常会使用无边框的窗体,其主要的实现方法为设置窗体属性为Qt::FramelessWindowHint, 但是这个方法在某些Mac版本下面会出现无法缩小的问题,即调用showMinimized()无效。网上有说是Qt老版本的bug,也有一些比较复杂的解决方案,经过多次尝试,这里提供一种投机取巧的方法,亲测有效。其主要的原理是

Qt去掉边框有两种方法,一种是设置窗口标志Qt::FramelessWindowHint, 一种是设置窗口标志Qt::CustomizeWindowHint,这两种的区别是第二种是可以拖拽边框放大缩小的。经过测试,当设置为第二种模式时,是可以响应showMinimized()函数的。因此我们的解决方案是在调用showMinimized前先将窗口标记改为Qt::CustomizeWindowHint,此时系统会去掉Qt::FramelessWindowHint属性并添加上Qt::WindowTitleHint属性,showMinimized()后重新恢复标记FramelessWindowHint,并需要强制调用以下show。这里的show的原理我不是很清楚,但是不调用这个,好像setWindowFlags会不生效,从而导致出现两个边框的效果。如果大佬有知道show原理的,请帮忙解下惑。另外如果大家有更好的方法,也请赐教下。具体核心代码见下图

 

Qt::FramelessWindowHint Produces a borderless window. The user cannot move or resize a borderless window via the window system. On X11, the result of the flag is dependent on the window manager and its ability to understand Motif and/or NETWM hints. Most existing modern window managers can handle this.
Qt::CustomizeWindowHint Turns off the default window title hints.
void QMyDialog::onBtnMinClikced(bool)
{
	setWindowFlags((windowFlags() | Qt::CustomizeWindowHint) & (~Qt::WindowTitleHint));
	showMinimized();
	setWindowFlags(windowFlags() & (~Qt::CustomContextMenu & ~Qt::WindowTitleHint) | Qt::FramelessWindowHint);
	show();
}

 

你可能感兴趣的:(qt,mac)