【问题标题】:Intercept widget move/resize before it happens在发生之前拦截小部件移动/调整大小
【发布时间】:2017-04-02 07:33:59
【问题描述】:

我正在使用QMdiSubWindow,我想捕获任何试图修改窗口大小/形状/位置的输入,并过滤/修改结果位置和大小,以便小部件与网格对齐。

QResizeEvent 似乎为时已晚,即窗口已经调整大小,布局已经计算,并且通常已经安排了小部件的完整重绘。

resizeEventeventFilter 都只是让我了解刚刚发生的调整大小并在不希望更改时“撤消”它,这对我来说是一个巨大的性能问题(嵌入式设备,图形缓慢)。

我目前正在捕捉QMouseEvents 并修改报告的光标位置,但这很混乱,并没有捕捉到窗口几何形状发生变化的所有情况。

【问题讨论】:

  • 如果您想要对小部件几何形状进行这样的控制,QMdiArea/QMdiSubWindow 绝对是最佳选择吗?假设您坚持使用它,您可以创建带有Qt::FramelessWindowHint 窗口标志集的QMdiSubWindow,然后自己添加所需的移动/调整大小功能。乏味,但它可能比尝试有选择地禁用某些交互更容易。
  • @G.M.几何是QWidget 的属性,所以任何其他选择都会同样尴尬。我已经对它进行了子类化以捕获和修改鼠标事件,我还替换了我自己的移动和调整大小操作。一切正常,但代码感觉臃肿且奇怪地被黑了。还有一些关于通过任何其他方式更新尺寸的错误。

标签: qt qevent qmdiarea


【解决方案1】:

如果您通过拖动窗口边框来调整大小,那么您应该捕获像QEvent::NonClientAreaMouseButtonPress 这样的事件,请在此处查看更多信息 - QEvent::Type

您可以安装观察程序以检查更改的窗口大小并具有关于 NonClientDrag 的标志(例如)。
但问题是当用户按下“最大化”按钮或只是一个win+↑(在 WinOS 中)时该怎么办,另一方面,这种变化几乎是立竿见影的,所以你不应该担心它们。

【讨论】:

  • 我不确定这与我已经在做的事情有什么不同,捕获鼠标事件...我不需要捕获 NonClientAreaMouseButtonPress,因为我的 QMdiSubWindow 已完全包含在内在更大的QMdiArea 内。另外我的问题更多是关于如何防止事件发生,如何了解事件想要发生,但在它发生之前保持沉默或修改它。
  • 那么您可能应该查看The Event System,然后是关于 qApp()->installEventFilter(...) 的内容。您还可以在子窗口中锁定和解锁 fixedSize 标志。至于我,我现在正在寻找在 ResizeEvent 之前而不是之后做某事的解决方案
  • 来自文档:The QResizeEvent class contains event parameters for resize events. Resize events are sent to widgets that have been resized. 这就是我的方式,我想知道调整大小之前它发生...
  • 我认为您应该使用 WinAPI 或所需操作系统的任何 API。我认为调整大小的默认机制是从操作系统中获取的,然后你才能在 Qt 中捕获调整大小事件。可能有一个建议:尝试做你自己的调整机制,这将改变你的小部件的 FixedSizes。我想知道它是否会起作用,因为这只是我的猜测
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多