

前提是在linux中需要安装好Qt源码和Qt creater11.0
参考 :【C++】源码编译 Qt5.15.3|Ubuntu22.04 下 ROS 开发环境搭建-CSDN博客
Qt creater配置编译环境
因为在Qt当中使用的是Cmake,所以需要配置依赖项目
主要配置以下三项:
-
AMENT_PREFIX_PATH:告诉 ROS2 去哪里找编译好的功能包(需要包含当前工作空间和ROS)
-
CMAKE_PREFIX_PATH:CMake 找库、找头文件的路径(需要包含当前工作空间和Qt)
-
COLCON_PREFIX_PATH:colcon 编译时的依赖搜索路径(当前工作空间Install目录)
-
LD_LIBRARY_PATH:程序运行时找动态库的路径(增加Qt的lib目录)

配置结果

添加ROS功能包
在已经有了 一个含有src的工作空间后,可以在Src目录添加ROS2功能包,如下图

添加设计师界面
因为有了Qt的参与,使得ROS程序可以有GUI的界面存在,添加设计师界面

-
然后将cpp文件移动到功能包src目录
-
头文件移动到include目录
-
ui文件移动到ui目录
最终目录结构
在src目录创建main函数,右键添加新文件即可
├── CMakeLists.txt
├── include
│ ├── dashboard.h
│ └── looraysbot_ui
├── package.xml
├── src
│ ├── dashboard.cpp
│ └── main.cpp
└── ui
└── dashboard.ui
修改CMakelists.txt
cpp
cmake_minimum_required(VERSION 3.8)
project(looraysbot_ui)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)
# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(sensor_msgs REQUIRED)
find_package(Qt5 REQUIRED COMPONENTS Core Widgets)
#Qt不是标准 C++,它要额外生成代码
set(CMAKE_AUTOMOC ON) #MOC → 处理 Q_OBJECT
set(CMAKE_AUTORCC ON) #RCC → 处理资源文件
set(CMAKE_AUTOUIC ON) #UIC → 处理 .ui → 生成 ui_xxx.h
set(CMAKE_INCLUDE_CURRENT_DIR ON) #让 Qt能找到自动生成的ui_xxx.h
set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/ui) # UI文件不在 src/ 里,而在 ui/ 文件夹
include_directories(
include #去当前项目的 include/ 文件夹 找头文件
${CMAKE_CURRENT_BINARY_DIR} #去 编译生成文件的目录(build 目录) 找头文件
${Qt5Widgets_INCLUDE_DIRS} #去 Qt 安装目录找 Qt 的头文件(find_package后返回)
${rclcpp_INCLUDE_DIRS} #去 ROS2安装目录找ROS2头文件(find_package后返回)
)
add_executable(looraysBot_ui
include/dashboard.h #带Q_OBJEC的.h必须写进 CMake
src/dashboard.cpp
ui/dashboard.ui #.ui 文件 → 必须写进 CMake
src/main.cpp
)
target_link_libraries(looraysBot_ui Qt5::Widgets)
ament_target_dependencies(looraysBot_ui rclcpp sensor_msgs )
install(TARGETS looraysBot_ui
DESTINATION lib/${PROJECT_NAME})
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
# the following line skips the linter which checks for copyrights
# comment the line when a copyright and license is added to all source files
set(ament_cmake_copyright_FOUND TRUE)
# the following line skips cpplint (only works in a git repo)
# comment the line when this package is in a git repo and when
# a copyright and license is added to all source files
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
ament_package()
解释
- Qt不是标准 C++,它要额外生成代码
cpp
set(CMAKE_AUTOMOC ON) #MOC → 处理 Q_OBJECT
set(CMAKE_AUTORCC ON) #RCC → 处理资源文件
set(CMAKE_AUTOUIC ON) #UIC → 处理 .ui → 生成 ui_xxx.h
- find_package后返回关键字的值
cpp
find_package(rclcpp REQUIRED) → ${rclcpp_INCLUDE_DIRS} #去 ROS2安装目录找ROS2头文件
find_package(Qt5 REQUIRED COMPONENTS Core Widgets) → ${Qt5Widgets_INCLUDE_DIRS} #去 Qt 安装目录找 Qt 的头文件
- UI文件不在 src/ 里,而在 ui/ 文件夹
cpp
set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/ui)
- 让 Qt能找到自动生成的ui_xxx.h
cpp
set(CMAKE_INCLUDE_CURRENT_DIR ON)
- 带Q_OBJEC的 和 .ui 文件,.h必须写进 CMake
cpp
add_executable(looraysBot_ui
include/dashboard.h #带Q_OBJEC的.h必须写进 CMake
src/dashboard.cpp
ui/dashboard.ui #.ui 文件 → 必须写进 CMake
src/main.cpp
)
