我正在尝试确定我的应用程序的主窗口何时被移动。主窗口是一个标准的 QMainWindow,我们在 QApplication 上安装了一个 eventFilter 来寻找 QMainWindow 的 moveEvents,但没有一个被触发。由于各种原因,子类化 QMainWindow 并不是一个真正的选择。
除了启动 QTimer 来不断检查位置之外,对此的任何想法都将不胜感激。
我正在尝试确定我的应用程序的主窗口何时被移动。主窗口是一个标准的 QMainWindow,我们在 QApplication 上安装了一个 eventFilter 来寻找 QMainWindow 的 moveEvents,但没有一个被触发。由于各种原因,子类化 QMainWindow 并不是一个真正的选择。
除了启动 QTimer 来不断检查位置之外,对此的任何想法都将不胜感激。
我想最好将事件过滤器安装在顶级窗口,而不是应用程序。但是,如果您仍然没有得到QMoveEvent
s 并且您在 Windows 上工作,您可能可以覆盖winEventFilter()
并等待WM_MOVE
. 类似的功能可能适用于 Linux 和 Mac。
我通常不建议打破平台独立性,但有时它可能是有意义的。
子类化确实是最好的解决方案:-/
在实现顶层窗口的类中,您只需重载此函数:
virtual void moveEvent ( QMoveEvent * event )
从文档中:
此事件处理程序可以在子类中重新实现,以接收在事件参数中传递的小部件移动事件。当小部件收到此事件时,它已经在新位置。
旧位置可通过 QMoveEvent::oldPos() 访问。
这应该允许您检测主窗口是否已移动。为什么不能子类?您是否直接使用实例QMainWindow
?通常的用例是无论如何都要对其进行子类化。