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

时间:2011-11-09 00:01:43

标签: c++ qt

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

我该怎样做才能实现这个目标?

2 个答案:

答案 0 :(得分:5)

我设法找到一个适用于Qt的简单解决方案。它并不完美,因为我没有实现拖放,但我想它也可以使用类似于Visual Studio 2010窗口停靠的系统来完成。

以下是设置:

  1. 使您的窗口小部件类成为窗口内容 - 文件窗口小部件 - 继承自QDockWidget或QMdiSubWindow以外的其他内容。
  2. 现在,文档窗口小部件需要拥有(创建,保留和销毁)一个QDockWidget(它将是外部窗口)和一个QMdiSubWindow(它将是内部窗口)。他们需要隐藏起来。
  3. 假设您的主窗口在其中心有一个QMdiArea,您将需要添加特殊代码以在QMdiArea中注册文档的内部窗口。
  4. 在某处(在窗口标题栏或文档小部件中)添加一个按钮,触发从内部窗口切换到外部窗口。
  5. 如果我们按下该按钮并且文档小部件位于内部窗口中,我们将隐藏内部窗口,然后从中取消注册文档小部件。然后我们在外部窗口中注册文档窗口并显示它。
  6. 反过来,只需切换外部和内部窗口即可。
  7. 您可能需要添加一些特殊代码来删除文档(意味着隐藏所有窗口,然后从QMdiArea取消注册内部窗口)。
  8. 这样,只需按一下按钮,文档小部件就会从主窗口内的窗口跳转到窗口外面,没有任何问题。


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

    编辑:我在那里实施了WIP(检查关联的类):http://code.google.com/r/mjklaim-freewindows/source/browse/tools/aosdesigner/view/FreeWindowManager.hpp

答案 1 :(得分:0)

首先,我想说应该避免这种行为,因为它会让用户感到困惑。还有其他实现此类行为的方法(例如工具栏)。

我认为你需要考虑你的问题的逻辑 - 拖出窗口会导致从主窗口“取消固定”你的窗口,因此你的mdi孩子变成了常规的顶层窗口。然后将它拖拽应该会导致pinnig回到某个位置。您应该确定何时应该发生这种取消固定和固定后退 - 当mdi chidld到达mdi区域的边缘时?或者当光标在拖动时离开mdi区域?确切的答案将取决于这个问题的答案。

另一种方式,很可能你需要创建QMdiSubWindow后代并重新实现QMdiSubWindow :: moveEvent以检查是否执行了“unpinnig”移动,如果是,则在嵌入QMdiSubWindow的小部件上调用setParent(0)。然后你的小部件也应该重新实现moveEvent以检查它是否应该被固定(如果它已经不是那样)并创建你的QMdiSubWindow后代的新实例(如果你delete'它取消固定),或者使用你的QMdiSubWindow后代的存储副本上的setWidget(如果你没有delete'它取消固定)。