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

我该怎么做才能实现这一目标?

最佳答案

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

  • 使您的窗口小部件类成为窗口的内容 - 让我们称其为文档小部件 - 从 QDockWidget 或 QMdiSubWindow 之外的其他东西继承。
  • 现在文档小部件需要拥有(创建、保留和销毁)一个 QDockWidget,即外部窗口,以及一个 QMdiSubWindow,即内部窗口。它们都需要隐藏。
  • 假设您的主窗口在它的中心有一个 QMdiArea,您必须添加特殊代码以在 QMdiArea 中注册文档的内部窗口。
  • 在某处(在窗口标题栏或文档小部件中)添加一个按钮,触发从内部窗口到外部窗口的切换。
  • 如果我们按下那个按钮并且文档小部件在内部窗口中,我们隐藏内部窗口,然后从中取消注册文档小部件。然后我们将文档窗口注册到外部窗口并显示它。
  • 反过来,只需执行 5 切换外窗和内窗即可。
  • 您可能需要添加一些特殊代码来删除文档(意味着隐藏所有窗口,然后从 QMdiArea 取消注册内部窗口)。

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

    我正在一个开源项目中实现这个解决方案。完成并公开后,我会将链接放在这里。
    编辑:我有我的 WIP FreeWindowManager.hpp 实现(检查相关的类):https://code.google.com/archive/p/mjklaim-freewindows/source/default/source?page=2

    关于c++ - Qt : Can a QMdiSubWindow be moved outside a QMdiArea and QMainWindow?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8058765/

    10-10 01:44