python_qt_binding 源码详细分析

python_qt_binding 源码详细分析

工作区路径:/home/cp/work2/ros2Learn/ros2_humble/src/ros-visualization/python_qt_binding
版本:1.1.3,许可证 BSD

python_qt_binding 是 ROS Qt 栈的 Python Qt 绑定抽象层:统一 PyQt5PySide2 的导入路径,使 qt_guirqt 等包无需关心底层绑定实现。


1. 仓库结构

1
2
3
4
5
6
7
8
9
10
python_qt_binding/
├── src/python_qt_binding/
│ ├── __init__.py # 导出 QtCore/QtGui/QtWidgets
│ └── binding_helper.py # 绑定选择与加载
├── cmake/
│ ├── sip_helper.cmake # SIP 绑定生成(C++ 扩展)
│ └── shiboken_helper.cmake
├── test/test_imports.py
├── CMakeLists.txt / setup.py
└── package.xml

2. 核心机制

2.1 绑定选择

1
2
3
def _select_qt_binding(binding_name=None, binding_order=None):
DEFAULT_BINDING_ORDER = ['pyqt', 'pyside']
# 按顺序尝试 import PyQt5 / PySide2 模块

优先级:PyQt5 > PySide2(可通过环境或参数指定)。

2.2 统一导入

应用代码写法:

1
2
from python_qt_binding.QtCore import QObject, Signal, Slot
from python_qt_binding.QtWidgets import QMainWindow

__init__.py 在 import 时调用 _select_qt_binding(),设置全局 QT_BINDINGQT_BINDING_VERSION

2.3 CMake 辅助

为需要 SIP/Shiboken 生成 C++ Python 绑定的包(如 qt_gui_cpp)提供 sip_helper.cmakeshiboken_helper.cmake


3. 在栈中的位置

rqt / qt_guipython_qt_bindingPyQt5PySide2

所有 Python 版 rqt 插件 必须 通过本包导入 Qt,禁止直接 import PyQt5


4. 依赖

  • 运行时:python3-pyqt5pyside2(二选一)
  • 构建:ament_cmake + 可选 SIP 工具链

5. 测试

test_imports.py 验证 QtCoreQtGuiQtWidgets 可导入。


6. 小结

python_qt_binding 体量小但 全栈依赖:解决 ROS 生态中 PyQt/PySide 分裂问题,是 qt_gui_core 与所有 Python rqt 插件的基础。

文章互动

阅读 --

留言

0 条留言

正在加载留言…