我有一个QML应用程序(也QWidgets进行了测试,同样的问题),并使其无国界(但仍支持原生的WM功能,如Aero对齐等),我跟着这个通过实施QAbstractNativeEventFilter和应对WM_NCCALSIZE信号零:
switch(msg->message) {
case WM_NCCALCSIZE:
*r = 0;
return 1;
...
}
Run Code Online (Sandbox Code Playgroud)
我还设置了一些不在Qt命名空间中的窗口标志
SetWindowLong(hwnd, GWL_STYLE, WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPSIBLINGS | WS_BORDER | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_THICKFRAME);
Run Code Online (Sandbox Code Playgroud)
这工作正常,直到我移动或调整窗口大小导致Qt重新渲染和未上漆的区域宽度标题和边框的宽度出现:
在移动/调整大小之前
移动/调整大小后
我还通过在Qt中添加FramelessWindowHint标志找到了解决方法:
window->setFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::Dialog);
Run Code Online (Sandbox Code Playgroud)
但是现在当窗口状态发生变化(最大化,最小化,......)时,这个边距会再次出现.通过阻止WM_SIZE事件,例如当SIZE_MAXIMIZED是参数时,边距不会出现但是我也无法从Qt最大化窗口.这意味着它是Qt方面的问题.
我还注意到通过winspector检查窗口样式,在我最大化它之后会出现一个新的属性原子:
你能帮我解决这个问题吗?
我认为在窗口句柄上使用SetWindowLong
并使用 Qt Window Flags/Qt Widget Attributes 是自找麻烦。您可以查看 Qt 源代码,看看处理这些窗口标志时会发生什么。
当我创建无框窗户时,我通常这样做是为了防止移动和调整大小,因为我要单独管理所有这些。
我遇到的一个问题是,当屏幕键盘出现并停靠时,它会调整我的窗口大小。因此,除了调用之外,resize()
我还必须使用它setFixedSize
来防止当操作系统尝试更改窗口大小时我的小部件被操纵。
换句话说,QShortcut
如果您管理的是无框窗口,我将添加一个应用程序范围,监听捕捉键盘快捷键,并在发生时按照您想要的方式调整窗口大小。
希望有帮助。