qt_gui_core 源码详细分析
工作区路径:/home/cp/work2/ros2Learn/ros2_humble/src/ros-visualization/qt_gui_core
子包版本:2.2.5(统一发布)。
qt_gui_core 是 通用 Qt GUI 插件框架(源自 ROS 1 qt_gui),与 ROS 无强耦合的核心在 qt_gui 包;rqt 在其上叠加 ROS 插件发现。本目录含 6 个 ament 包。
1. 子包一览
| 包 | 类型 | 职责 |
|---|---|---|
| qt_gui_core | meta | 聚合依赖,无源码 |
| qt_gui | Python | 主框架:Main、PluginManager、Perspective |
| qt_gui_app | 可执行 | 独立 qt_gui 应用入口 |
| qt_gui_cpp | C++/Python | C++ 插件 Provider + 绑定 |
| qt_gui_py_common | Python | Python 插件公共基类/工具 |
| qt_dotgraph | Python | DOT/Graphviz 渲染(rqt_graph 依赖) |
2. 架构总览
3. qt_gui — 核心框架
3.1 入口 main.py
- 创建
QApplication - 实例化
PluginManager、PerspectiveManager、MainWindow - 加载 settings(perspective 布局持久化)
- 注册
PluginProvider链
3.2 PluginManager
1 | class PluginManager(QObject): |
职责:
- 发现插件(
PluginProvider.discover) - 加载/卸载插件实例(
PluginHandlerDirect/Container) - 管理 dock 布局与 perspective 保存
- 信号:
plugins_changed_signal、plugin_help_signal
3.3 关键模块
| 模块 | 作用 |
|---|---|
plugin_provider.py |
插件发现抽象 |
plugin_descriptor.py |
插件元数据(label、icon、group) |
plugin_handler_direct.py |
直接嵌入主窗口 |
perspective_manager.py |
布局快照 save/load |
settings.py |
QSettings 封装 |
dockable_main_window.py |
可停靠主窗口 |
icon_loader.py |
theme/file 图标 |
3.4 Plugin 基类
plugin.py 定义插件生命周期:
startup(context, instance_id)— 初始化shutdown()— 清理save_settings/restore_settings— 实例配置
4. qt_gui_cpp — C++ 插件
plugin.xml导出CppPluginProvider- 通过 pluginlib 加载
qt_gui_cpp::Plugin子类 - 提供
qt_gui_cpp::PluginContext,供 C++ 插件访问 node 等
5. qt_gui_py_common
Python 插件基类与 PluginContext 包装,被 rqt_gui_py 扩展为 ROS 感知版本。
6. qt_dotgraph
- 将 DOT 语言 解析为 Qt Graphics 场景
- rqt_graph 用于绘制 ROS 计算图
- 依赖
pydot/ Graphviz
7. qt_gui_app
提供非 ROS 的 qt_gui 独立可执行文件,用于测试纯 Qt 插件。
8. 插件发现流程
RecursivePluginProvider遍历 ament index 中qt_gui/rqt_guiplugin 声明- 读取各包
plugin.xml - 解析
<class type="..." base_class_type="qt_gui_py::Plugin"> PluginManager按菜单分组展示,用户选择后PluginHandler实例化
9. 与 rqt 的关系
| 层 | 包 |
|---|---|
| 通用 GUI | qt_gui_core |
| ROS 入口 | rqt_gui(继承 qt_gui.main.Main) |
| ROS 插件 | rqt_* 包 |
rqt_gui 额外注册 RosPluginProvider、RosPyPluginProvider,扫描 ROS 包 export。
10. 依赖
1 | qt_gui → python_qt_binding, tango_icons_vendor |
11. 推荐阅读顺序
qt_gui/main.py— 启动流程plugin_manager.py— 生命周期plugin_provider.py+recursive_plugin_provider.py— 发现机制perspective_manager.py— 布局持久化rqt_gui/main.py— ROS 扩展点qt_dotgraph— 图渲染(配合 rqt_graph)
12. 小结
qt_gui_core 提供 与 ROS 无关的 Qt 插件壳:Perspective、Dock、PluginManager 是 rqt 的基石;ROS 特有逻辑(rclpy、话题图)在 rqt 与各 rqt_* 插件中实现。
正在加载留言…