Hi~,这里是每周Qt,致力分享有价值的Qt知识。

今天每Q给大家介绍一个比较强大的三方库 – Qt Advanced Docking System,简称 ADS。项目基本信息如下:
  • 最新版本 (2周前):v4.4.1
  • License: LGPL 2.1
  • Starred:2.3k
  • OS:Windows/Linux/macOS
这个库主要实现复杂桌面软件小窗口自由停靠的功能。可以让你打造出像VS一样强大的窗口交互。如果你用过 Qt Design Studio(简称 QDS),那么你不会感到陌生的,虽然 QDS 本身的使用体验非常一般 🙂
01  基本功能
我们先来看看提供的基本功能。

任意停靠 – 无需 CenterWidget

它不像 Qt 的停靠系统那样有 CenterWidget。您可以停靠在主窗口的每个边框上,也可以停靠到每个停靠区域(Dock area)。因此,您几乎可以在任何地方自由停靠。

停靠在浮动窗口内

主窗口和浮动窗口没有区别,支持停靠到浮动窗口。


整组窗口拖动
拖动停靠栏的标题栏时,所有与其关联的选项卡都会被拖动。因此,您可以将整组选项卡式窗口 Widget 移动到浮动窗口 Widget 中,或者从一个停靠区域移动到另一个停靠区域。

快速切换预设的视图布局

预设视图定义了主窗口中停靠窗口的集合和布局。您可以将停靠管理器的当前布局保存到一个命名的预设视图中,以创建您自己的自定义预设视图。之后,您只需从预设视图中选择一个预设视图,即可快速切换完整的主窗口布局。这样可以实现几种工作场景视图快速切换。

分割器大小实际调整和占位调整

高级停靠系统使用标准 QSplitter 作为调整大小的分隔符,因此支持 QSplitter 的动态调整延迟调整大小功能。在极少数情况下,对于非常复杂的窗口 Widget 或在性能较差的机器上,通过分隔符动态调整大小可能会导致窗口  Widget 内部渲染内容掉帧或白屏。
全局停靠管理器标志 OpaqueSplitterResize 用于配置分隔符的大小调整行为。如果设置了此标志,则在交互移动分隔符时,窗口 Widget 会动态地调整大小。动态调整效果如下:
如果清除此标志,就是延迟调整Widget 大小调整会延迟到鼠标松开。

下拉菜单可轻松处理多个选项卡

标签页是快速切换 Dock widget 的好方法。但是,如果标签页过多,不是那么容易找到想要的标签。为了解决这种情况,可以使用标签页下拉框。可以从下拉菜单中快速选择要激活的 Dock widget

分离 DockWidget 

您可以通过以下方式分离 DockWidget 以及 DockArea:

  • 通过拖动 DockWidget 选项卡或 DockArea 标题栏
  • 双击选项卡或标题栏
  • 通过使用选项卡和标题栏下拉菜单中的分离菜单项

支持删除动态创建的 DockWidget

一般情况下,点击 Dock 控件的关闭按钮只会隐藏该控件,用户可以使用 Dock 控件的 toggleView() 操作再次显示它。这适用于控件数量固定的用户界面。但 ADS 也支持动态 Dock 控件,这些控件在关闭时会被删除。如果您为某个 Dock 控件设置了 DockWidgetDeleteOnClose 标记,那么当您关闭该 Dock 控件时,它将被立即删除。

自动隐藏功能

ADS 4.0 版本新增了自动隐藏功能。可以注意最右侧有几个标签按钮,可以实现利用更小的屏幕空间显示更多信息。

ADS 支持所有停靠容器(即主窗口和每个浮动窗口 Widget )的“自动隐藏”功能。以下是所有自动隐藏功能的列表:
  • 支持主窗口和所有浮动停靠容器
  • 支持通过鼠标点击或鼠标悬停显示和隐藏
  • 支持动态/延迟分隔调整大小标志
  • Dock 固定
  • 配置固定按钮是否应固定当前停靠窗口 Widget 选项卡或整个停靠区域
  • 单击固定按钮并按住 Ctrl 键即可固定整个停靠区域
  • 支持 CSS 样式化
  • 向后兼容的状态文件格式 – 可以加载旧版 Dock 管理器状态文件,而旧版本可以加载带有自动隐藏状态信息的新状态文件
02  新特性
近期 ADS 4.1 更新了一些自动隐藏功能,使用旧版本的朋友们可以看看。

拖放自动隐藏

如果您将停靠窗口 Widget 拖到四个窗口边框之一附近,则会显示特殊的叠加层,指示自动隐藏窗口 Widget 的放置区域:

当然,这也适用于 DockArea:

如果您将一个停靠窗口 Widget 或停靠区域拖到侧边栏,您甚至可以控制选项卡的插入位置。只需将鼠标拖到特定的自动隐藏选项卡上,拖动的停靠窗口 Widget 就会插入到该选项卡之前。

自动隐藏标签随意移动

您还可以将“自动隐藏”标签页拖动到新的自动隐藏位置。您可以将它们拖动到其他边框或侧边栏:

自动隐藏标签排序

您可以将“自动隐藏”选项卡拖动到当前侧边栏中的新位置以对其进行排序:

开源项目分享:开发生产力软件你还没听过它?

自动隐藏拖动至DockWidget

您还可以简单地将“自动隐藏”选项卡移动到另一个DockWidget ,或通过拖放将其变为浮窗:

自动隐藏上下文菜单

所有自动隐藏选项卡现在都拥有一个上下文菜单,提供您在 Dock Widget 选项卡中熟悉的所有功能。使用上下文菜单中的 “固定到… ”项,可以轻松地将自动隐藏选项卡移动到其他自动隐藏侧边栏:

03  平台支持情况

Qt 版本支持

目前 Qt5 和 Qt6 版本都完美支持,包括较新的 Qt6.9

操作系统支持

Windows 10/11

该库是在 Windows 上开发的,并且是为 Windows 开发的。已经被商业应用大量使用,所以可靠性和稳定性是经过检验的。

macOS
也可以在 macOS 上用。实际上作者没有测试这个平台,但是有用户说用过。不过 QDS 也是很好的证明,QDS 有很多 macOS的用户。

Linux
实际上 Linux 系统比较复杂,发行版众多,并且使用了不同的窗口管理系统,导致出现各种差异,所以只能针对几个典型的系统进行测试。根据所使用的窗口管理器或合成器,库可能支持或不支持带有原生标题栏的停靠窗口 Widget 。如果不支持原生标题栏,将切换到基于 QWidget 的标题栏。经过测试的支持情况如下:

OS
说明
Kubuntu 18.04 和 19.10
使用 KWin -> 没有原生标题栏
Ubuntu 18.04、19.10 和 20.04
支持原生标题栏
Ubuntu 22.04
使用 Wayland -> 没有原生标题栏


04  案例展示

Qt Creator IDE
从 4.12 版本开始,QTC 在其 Qt Quick Designer 中使用了ADS。QTC 现在已经更新到了 17.0版本,这个已经移除了。


Qt Design Studio

The most obvious change in Qt Design Studio is the integration of dock widgets using the Qt Advanced Docking System. This allows the user to fully customize the workspace and also to undock any view into its own top level window. 


CETONI Elements

CETONI Elements 软件是一款功能很全的模块化实验室自动化软件,可通过图形用户界面控制 CETONI 设备。该软件拥有强大的脚本系统,可实现流程自动化。此外,该软件还采用先进的ADS,让用户可以自由排列各种插件提供的所有视图和窗口。

Notepad next

Notepad Next 是 Notepad++ 的跨平台实现,基于Qt,有12k的Starred,比这个项目还火。它也使用ADS实现窗口管理。可能也有人听过另一个用Qt 实现的 Notepad–。对文本编辑器技术感兴趣的可以去 github 看看。

ResInsight
ResInsight 是 Ceetron Solutions 推出的一款用于油气模拟数据可视化的软件。

还有一些案例没有放在这里,比较多,不过已经可以看出来确实经历了锤炼。不知道有多少大佬已经用过这个库了,可以评论区聊聊使用经验。后面持续分享有价值的开源组件,每Q提前感谢各位关注、点赞👍、在看❤️的帅哥美女们~


参考文献

[1]https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System?tab=readme-ov-file


欢迎投稿到[email protected],无格式要求。你的最佳实践,值得被看见!