1.背景
之前使用qt自带的编译方式(qmake的方式)编写运行qt程序,但是最近要跟ros框架的其他程序进行通讯要使用ros topic订阅发布,必须用msg,有些msg不能简单的使用std标准消息需要自己定义,但是qmake的方式不支持只能用ros自己的方式,因此想要将自己的程序变成ros放在Ros的框架中,使用cmake的编译方式
2.工程说明
1.QT程序中使用了widget类跟qml结合的方式。
2. 工程中调用的qt的库:
QT += core gui network quick qml positioning location quickwidgets
3.步骤(以自己的工程为例)
3.1 创建工作空间文件夹,并执行编译
mkdir -p ~/ros_qt_workspace/src
cd ~/ros_qt_workspace/
catkin_make
3.2 创建ros工程:
cd src #进入src目录
catkin_creat_pkg qt_app roscpp std_msgs #创建ros工程(工程名qt_app, 依赖roscpp std_msgs)
3.3 将对应的自己程序的目录放在src下面:
自己原有proj程序的目录
将自己的 文件移植到上面的src文件下:
自己单独把原来调用的外部lib放在跟src同级下面(也可以放在src下)
注意:移植后别忘了修改cpp中调用的头文件(因为对应的目录发生了变化)
3.4 修改cmakelist文件
##############################################################################
# CMake version
##############################################################################
cmake_minimum_required(VERSION 2.8.3)
##############################################################################
# Project name
##############################################################################
project(app)
##############################################################################
# Catkin
##############################################################################
## Compile as C++11, supported in ROS Kinetic and newer
add_compile_options(-std=c++11)
add_definitions(-std=c++11)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
)
##############################################################################
# Qt Environment
##############################################################################
find_package(Qt5 REQUIRED COMPONENTS Widgets Core Gui Qml QuickWidgets Network Location Positioning)
#find_package(Qt5Widgets CONFIG REQUIRED)
###################################
## catkin specific configuration ##
###################################
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES truck_monitor
# CATKIN_DEPENDS roscpp rospy std_msgs
# DEPENDS system_lib
)
###########
## Build ##
###########
include_directories(
include/
${CMAKE_CURRENT_BINARY_DIR}/..
${catkin_INCLUDE_DIRS}
)
##############################################################################
# Sections
##############################################################################
set(CMAKE_AUTOMOC ON) # 设置自动生成moc文件,AUTOMOC打开可以省去QT5_WRAP_CPP命令
set(CMAKE_AUTORCC ON) # Resource files
set(CMAKE_AUTOUIC ON) # 设置自动生成ui.h文件,AUTOUIC打开可以省去QT5_WRAP_UI命令
# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON) # 设置工程包含当前目录,非必须
##############################################################################
# Sources
##############################################################################
file(GLOB_RECURSE SRC_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} FOLLOW_SYMLINKS src/*.cpp)
#同理,查找当前文件夹中所有的头文件
file(GLOB_RECURSE HEAD_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} FOLLOW_SYMLINKS src/*.h)
#添加资源文件
SET(RCC_FILES src/source.qrc)
##############################################################################
# Binaries
##############################################################################
link_directories(${PROJECT_SOURCE_DIR}/lib) #添加动态连接库的路径
##############################################################################
# 创建工程文件
##############################################################################
add_executable(${PROJECT_NAME} ${SRC_FILES} ${HEAD_FILES} ${RCC_FILES})
target_link_libraries(${PROJECT_NAME} ${QT_LIBRARIES} ${catkin_LIBRARIES})
target_link_libraries(${PROJECT_NAME} Qt5::Widgets Qt5::Core Qt5::Gui Qt5::Qml Qt5::QuickWidgets Qt5::Network Qt5::Location Qt5::Positioning)
target_link_libraries(${PROJECT_NAME} -ltcptd ) #这是自己调用的外部库
target_link_libraries(${PROJECT_NAME} -lsudp ) #这是自己调用的外部库
3.5 运行程序
声明:自己在书写cmakelist文件以及运行程序的时候还是使用qt。但是还可以使用ros的catkin_make。
方法:(在修改cmaklist之前)
3.5.1 打开qt creator
3.5.2 打开文件---》找到src下面的cmakelists.txt文件,打开
3.5.3 可以在qt中修改cmakelists.txt文件以及对应的其他文件,编译运行的时候还是点击绿色的箭头。
生成的程序以及对应的配置文件放在: