如何使两个并排的Qt窗口保持粘性并像一个窗口一样工作?

如何使两个并排的Qt窗口保持粘性并像一个窗口一样工作?,qt,widget,drag,Qt,Widget,Drag,我正在尝试实现一个场景,其中两个Qt窗口将并排放置,并且它们将有点粘在一起。通过拖动其中一个,另一个也会被拖动。即使在执行alt选项卡时,它们的行为也应类似于单个窗口 任何帮助或指针都将非常有用 -Soumya在跟踪窗口上安装事件筛选器,并启用筛选器 然后,只要使用该事件类型调用过滤器,您就可以更改跟踪窗口的位置。您所描述的内容听起来很适合“停靠”场景。您可能最熟悉从工具栏停靠;在这里,您可以自行浮动工具栏,也可以将工具栏粘贴到应用程序窗口的任何边缘。但Qt有一个更普遍的机制: 在这种情况下

我正在尝试实现一个场景,其中两个Qt窗口将并排放置,并且它们将有点粘在一起。通过拖动其中一个,另一个也会被拖动。即使在执行alt选项卡时,它们的行为也应类似于单个窗口

任何帮助或指针都将非常有用


-Soumya

在跟踪窗口上安装事件筛选器,并启用筛选器


然后,只要使用该事件类型调用过滤器,您就可以更改跟踪窗口的位置。

您所描述的内容听起来很适合“停靠”场景。您可能最熟悉从工具栏停靠;在这里,您可以自行浮动工具栏,也可以将工具栏粘贴到应用程序窗口的任何边缘。但Qt有一个更普遍的机制:


在这种情况下,不会有多个顶级窗口与它们自己的标题栏等同步移动。当顶层窗口需要“粘滞”时,它们将合并到一个包含窗口中。但在我看来,这在几乎任何情况下都更为优雅,并提供了您似乎正在寻找的属性。

我找到了一种方法来固定两个窗口:当用户移动一个窗口时,另一个窗口跟随,保持其相对于移动窗口的相对位置

这有点像黑客,因为它假设当用户左键单击标题栏,按住标题栏同时移动窗口,并在最后将其释放时,事件被发送

其思想是使用每个窗口的事件处理程序来更新另一个窗口的几何体,使用

但文件指出:

在resizeEvent()或moveEvent()内调用setGeometry()会导致无限递归。

因此,我需要防止用户未直接移动的窗口的
moveEvent
处理程序更新另一个窗口的几何体

我通过截取上述事件的总和来达到这一目的

当用户单击
WindowOne
的标题栏开始移动操作时,
WindowOne::eventFilter
捕获其
QEvent::nonclientareamousebutonpress
并将公共属性
WindowTwo::skipevent_two
设置为
true

当用户移动
WindowOne
时,调用
WindowTwo::moveEvent
WindowTwo
WindowOne::moveEvent
执行的
setGeometry
操作

WindowTwo::moveEvent
检查
WindowTwo::skipevent\u two
,如果为
true
,则返回而不在
WindowOne
上执行
setGeometry
操作,这将导致无限递归

一旦用户释放鼠标左键,结束窗口移动操作,
WindowOne::eventFilter
捕获
QEvent::nonclientareamousebutonrelease
并将公共属性
WindowTwo::skipevent\u two
设置为
false

如果用户单击
WindowTwo
的标题栏,将执行相同的操作,这一次会导致
WindowOne::skipevent\u one
属性设置为
true
,并阻止
WindowOne::moveEvent
WindowTwo
执行任何
setGeometry
操作

我认为这个解决方案远远不够干净和实用。一些问题:

  • 除了上面考虑的情况外,我不确定何时以及为什么调度
    QEvent::nonclientreamousebutonrelease
    QEvent::nonclientreamousebutonrelease
  • 当/如果一个窗口在没有用户交互或没有用户正确点击鼠标的情况下被调整大小,可能所有的事情都会以无限递归的方式进行
  • 无法保证这些鼠标事件将来会以相同的方式发送
  • 更多的免费空间
概念证明:

技术上是可能的,但你不认为OP应该考虑<代码> QDOCKWIDGET ,而不是进行一些怪异的事情吗?我不认为QDOKWWIDGET是合适的。是的,这是一种对小部件进行分组的方法,但是您需要做一些“奇怪”的事情,以防止它们被取消分组!如果你尝试移动一个小部件,它将取消对接,而不是推它的粘性邻居。我很少看到这种方法的有效实现。WinAmp做了一些有趣的粘性…但他们试图优化屏幕的真实性,而不是将媒体播放器、播放列表和EQ组合成一个边框…因为它可能“在顶部”,而不是用户的焦点。因此,如果问题的措辞不是“我不想使用QDockWidget,因为……”,我倾向于假设缺乏对QDockWidget的认识!这似乎是一个可能的实现。我一定会试试这条路线。谢谢。