QSizeGrip and Qt::Popup

QSizeGrip and Qt::Popup

本文关键字:Popup Qt and QSizeGrip      更新时间:2023-10-16

当我添加一个QSizeGrip到一个小部件(如QWidgetQDialog),然后启用Qt::Popup窗口标志,大小控制不再工作。

为什么?

我想创建一个可调整大小的无边框弹出窗口,就像在QCompleter中使用的那样。设置Qt::FramelessWindowHint标志似乎使其无边界,但焦点行为是完全不同的…

在通读了Qt源码后,我找到了两种可能的解决方案。

基本上,QSizeGrip提供了一个非常好的基本实现,即使在设置了Qt::Popup或由于其他原因窗口无边界时也能正常工作。然而,Qt尝试使用一种特定于平台的机制来提供大小控制。

至少在Linux/X11下,当设置了Qt::Popup标志时,这种机制似乎失败了。

这个想法是绕过使用平台特定机制,始终使用基本实现(又名Qt的回退)。这可以通过

实现
  • 设置Qt::BypassWindowManagerHint标志或
  • 重新实现QWidget::hasHeightForWidth()返回true(并适当地提供中立的Qt::heightForWidth())。