我正在编写某种编辑器,我想允许用户在MdiArea中自由移动窗口并允许它们将窗口移出MdiArea,从应用程序的主窗口移出。
我该怎样做才能实现这个目标?
答案 0 :(得分:5)
我设法找到一个适用于Qt的简单解决方案。它并不完美,因为我没有实现拖放,但我想它也可以使用类似于Visual Studio 2010窗口停靠的系统来完成。
以下是设置:
这样,只需按一下按钮,文档小部件就会从主窗口内的窗口跳转到窗口外面,没有任何问题。
我正在开源项目中实现此解决方案。一旦完成并公开,我将把链接放在这里。
编辑:我在那里实施了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
'它取消固定)。