qt_gui_core 源码详细分析

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. 架构总览

入口qt_gui插件提供者qt_gui_app / rqt_gui.mainmain.MainPluginManagerPluginProviderPerspectiveManagerMainWindow / DockWidgetqt_gui_cpp.CppPluginProviderrqt_gui_py.RosPyPluginProviderRecursivePluginProvider

3. qt_gui — 核心框架

3.1 入口 main.py

  • 创建 QApplication
  • 实例化 PluginManagerPerspectiveManagerMainWindow
  • 加载 settings(perspective 布局持久化)
  • 注册 PluginProvider

3.2 PluginManager

1
2
3
class PluginManager(QObject):
"""Manager of plugin life cycle.
Creates PluginHandler for each instance, maintains perspective-specific running plugins."""

职责:

  • 发现插件(PluginProvider.discover
  • 加载/卸载插件实例(PluginHandlerDirect / Container
  • 管理 dock 布局与 perspective 保存
  • 信号:plugins_changed_signalplugin_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. 插件发现流程

  1. RecursivePluginProvider 遍历 ament index 中 qt_gui / rqt_gui plugin 声明
  2. 读取各包 plugin.xml
  3. 解析 <class type="..." base_class_type="qt_gui_py::Plugin">
  4. PluginManager 按菜单分组展示,用户选择后 PluginHandler 实例化

9. 与 rqt 的关系

通用 GUI qt_gui_core
ROS 入口 rqt_gui(继承 qt_gui.main.Main)
ROS 插件 rqt_* 包

rqt_gui 额外注册 RosPluginProviderRosPyPluginProvider,扫描 ROS 包 export。


10. 依赖

1
2
3
qt_gui → python_qt_binding, tango_icons_vendor
qt_gui_cpp → qt_gui, pluginlib, python_qt_binding (sip)
qt_dotgraph → python_qt_binding, pydot

11. 推荐阅读顺序

  1. qt_gui/main.py — 启动流程
  2. plugin_manager.py — 生命周期
  3. plugin_provider.py + recursive_plugin_provider.py — 发现机制
  4. perspective_manager.py — 布局持久化
  5. rqt_gui/main.py — ROS 扩展点
  6. qt_dotgraph — 图渲染(配合 rqt_graph)

12. 小结

qt_gui_core 提供 与 ROS 无关的 Qt 插件壳:Perspective、Dock、PluginManager 是 rqt 的基石;ROS 特有逻辑(rclpy、话题图)在 rqt 与各 rqt_* 插件中实现。

文章互动

阅读 --

留言

0 条留言

正在加载留言…