Qt::AA_DontCreateNativeWidgetSiblings使用注意事项
当切换 QMdiArea 的子窗口时,有一个窗口会“弹出来”浮动在其他窗口上方,造成重叠。
这个问题的确可能是因为你设置了:
QGuiApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings);
🧾 这个属性 Qt::AA_DontCreateNativeWidgetSiblings 是干什么的?
这个属性的作用是:
禁止 Qt 为同级 widget 创建原生平台窗口(比如 HWND、NSWindow 等)
主要用于优化资源、嵌入式场景等。但在 QMdiArea 中,会引起子窗口的一些异常行为。
❗ 它会造成哪些问题?
QMdiSubWindow 的 tab 管理依赖于原生窗口机制。
设置这个属性后,tab 化的窗口在切换时,可能会“脱离 tab”,浮动出来。
Qt 无法正确管理这些窗口的层级、焦点和布局。
✅ 正确做法:
如果你没有特殊需求,建议你 不要设置这个属性:
// 删掉或注释掉这行
// QGuiApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings);
如果你必须设置它(比如某些嵌入式平台),那么:
建议 不要使用 QMdiArea 的 TabbedView 模式,改用 SubWindowView;
或者 避免子窗口设置为 Qt::Window 类型,强制为 Qt::Widget。
✅ 建议小结:
需求 建议
使用 QMdiArea 的 tab 模式 不要设置 AA_DontCreateNativeWidgetSiblings
必须设置该属性 改用子窗口模式,不使用 tab,或避免子窗口使用 Qt::Window 类型