QMdiSubWindow可以移动到QMdiArea和QMainWindow之外吗?

Qt : Can a QMdiSubWindow be moved outside a QMdiArea and QMainWindow?

本文关键字:QMainWindow QMdiArea 移动 QMdiSubWindow      更新时间:2023-10-16

我正在编写某种编辑器,我想允许用户在MdiArea内自由移动窗口,并允许他们将窗口移出MdiArea,移出应用程序的主窗口。

我应该如何做到这一点?

我设法找到了一个简单的解决方案,与Qt工作。它不是完美的,因为我没有实现拖放,但我想它也可以做一个系统类似于Visual Studio 2010窗口停靠。

设置如下:

  1. 让你的窗口小部件类的内容-让我们称之为文档小部件-继承其他东西,而不是QDockWidget或QMdiSubWindow。
  2. 现在文档小部件需要拥有(创建,保留和销毁)一个QDockWidget,这将是外部窗口,和一个QMdiSubWindow,这将是内部窗口。它们都需要被隐藏。
  3. 假设你的主窗口在它的中心有一个QMdiArea,你必须添加特殊的代码来注册你的文档在QMdiArea的内部窗口。
  4. 在某个地方(在窗口标题栏或文档小部件中)添加一个按钮,触发从内部窗口切换到外部窗口。
  5. 如果我们按下那个按钮,文档小部件在内部窗口,我们隐藏内部窗口,然后注销文档小部件。然后我们将文档窗口注册到外部窗口并显示它。
  6. 相反,只需执行5,切换外部和内部窗口。
  7. 你可能需要添加一些特殊的代码来删除文档(意思是隐藏所有窗口,然后从QMdiArea注销内部窗口)。

这样,文档小部件将从主窗口内的窗口跳转到主窗口外的窗口,没有任何问题,只需按一个按钮。


我正在一个开源项目中实现这个解决方案。一旦完成并公开,我将把链接放在这里。

编辑:我已经但我的WIP FreeWindowManager.hpp实现那里(检查相关类):https://code.google.com/archive/p/mjklaim-freewindows/source/default/source?page=2

首先,我想说这种行为应该避免,因为它会让用户感到困惑。实现这种行为还有其他方法。

工具栏)。

我认为你需要考虑你的问题的逻辑——拖出窗口会导致你的窗口从主窗口"解除固定",因此你的mdi子窗口成为常规的顶层窗口。然后拖拽它应该会在某一点上造成夹紧。您应该定义何时应该发生这种解除固定和恢复固定-当mdi子节点到达mdi区域的边缘时?或者当光标离开mdi区域时仍在拖动?确切的答案将取决于这个问题的答案。

另一种方式,最有可能的是你需要创建QMdiSubWindow后代并重新实现QMdiSubWindow::moveEvent来检查是否执行了"unpinping"移动,如果是,在嵌入在QMdiSubWindow中的小部件上调用setParent(0)。然后你的小部件也应该重新实现moveEvent检查它是否应该被钉回去(如果它已经不是),并创建你的QMdiSubWindow后代的新实例(如果你delete 'd它在unpin),或使用setWidget上存储的QMdiSubWindow后代的副本(如果你没有delete 'd它在unpin)。