背景:
qt creator(版本5.10.1) + ubuntu 16
步骤:
(1)安装qt 5.10.1:
https://blog.csdn.net/ipfpm/article/details/80698659
(2)配置qt creator 设置快捷方式:这一步将要修改Qt Creator快捷方式,使从快捷方式启动Qt Creator的同时加载ROS环境变量。
这条命令将打开DigiaQtOpenSource-qtcreator.desktop快捷方式文件,可以看到文件内容如下:
[Desktop Entry]
Type=Application
Exec=/home/ubu/Qt5.8.0/Tools/QtCreator/bin/qtcreator
Name=Qt Creator (Community)
GenericName=The IDE of choice for Qt development.
Icon=QtProject-qtcreator
Terminal=false
Categories=Development;IDE;Qt;
MimeType=text/x-c++src;text/x-c++hdr;text/x-xsrc;application/x-designer;application/vnd.qt.qmakeprofile;application/vnd.qt.xml.resource;text/x-qml;text/x-qt.qml;text/x-qt.qbs;
-
修改 Exec 变量一行,中间添加 bash -i -c 即改为 Exec=bash -i -c /home/ubu/Qt5.8.0/Tools/QtCreator/bin/qtcreator ,保存并退出。
-
添加 bash -i -c 是为了在通过快捷方式启动Qt Creator的同时加载ROS环境变量
-
如果打开的文件是空,则表示没有找到DigiaQtOpenSource-qtcreator.desktop文件
-
可能是安装路径不在本地用户目录下,或者版本不同导致的文件名不一致。
-
可以在 ~/.local/share/applications/ 和 /usr/share/applications/ 两个路径下用 ls qt 命令找找看。
-
如果没有上述快捷方式文件,自己新建一个,只要文件内容类似上面的类容,路径正确即可。
-
快捷方式可以放在 ~/.local/share/applications/ 和 /usr/share/applications/ 两个位置。
-
当然也可以放在任意其他位置,功能跟放在上面两个位置一样,但左边的任务栏不会正确显示图标。
(3)安装配置ros:
https://blog.csdn.net/ipfpm/article/details/83504391
(4)命令行创建ros工程:
mkdir -p ~/ros_qt_workspace/src
cd ~/ros_qt_workspace/
catkin_make
//这是来自ros官网的最基础操作,此时即将会拥有一个空的ros程序包,但里面还没有创建任何程序
(5)在上述空的工程中,创建一个ros程序:
cd src
catkin_creat_pkg qt_app roscpp std_msgs
(5)此时并没有任何cpp文件生成,需要自己添加一个包含main函数的cpp文件
新建一个包含main函数的极其简单的cpp文件,我们这里取名为qt_app_node.cpp,放在了src目录下,还自己写了一个头文件qt_app_node.h,放在了include/qt_app目录下
//这不是最终的文件,只是一个空工程模板
#include <qt_app_node.h>
int main(int argc, char *argv[])
{
return 0
}
(6)使用Qtcreator添加窗口类文件。(添加界面)
跟随向导一路下来,将会在工程目录下src文件夹中多出三个文件mainwindow.cpp、mainwindow.h和mainwindow.ui,前两个文件定义了窗口类,后一个ui文件描述了窗口样式。
(7)此时,这些新创建的文件和原本的ros工程还没建立任何关系,只是目录下多出了几个文件而已,并不参与真正的编译,下面要修改cmakelist文件,让这些窗口类文件参与编译。
重点内容:修改cmakelist.txt文件
下面是一份完整的cmakelist文件,里面配置了与Qt相关的内容
cmake_minimum_required(VERSION 2.8.3)
project(qt_app)
## Compile as C++11, supported in ROS Kinetic and newer
add_compile_options(-std=c++11)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
)
find_package(Qt5 REQUIRED COMPONENTS Widgets )
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(SOURCES
src/qt_app_node.cpp
src/mainwindow.cpp
)
set(FORMS
src/mainwindow.ui
)
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES qt_app
# CATKIN_DEPENDS roscpp rospy std_msgs
# DEPENDS system_lib
)
include_directories(
include/qt_app
${catkin_INCLUDE_DIRS}
)
add_executable(${PROJECT_NAME}_node ${SOURCES} ${FORMS} )
target_link_libraries(${PROJECT_NAME}_node
${catkin_LIBRARIES}
)
target_link_libraries(${PROJECT_NAME}_node Qt5::Widgets )
find_package(Qt5 REQUIRED COMPONENTS Widgets )
这是找到qt5中的widgets组件的关键步骤,使程序编译时能够找到qt5-widgets相关头文件和库函数。
set(SOURCES
src/qt_app_node.cpp
src/mainwindow.cpp
set(FORMS
src/mainwindow.ui
指明需要参与编译的cpp及ui文件,分别给它们起个变量名叫SOURCES和FORMS,后续会用到。
add_executable(${PROJECT_NAME}_node ${SOURCES} ${FORMS} )
这是生成可执行文件,此时用到了SOURCES和FORMS所指明的cpp和ui文件。
target_link_libraries(${PROJECT_NAME}_node Qt5::Widgets )
在链接环节,告诉目标文件需要qt5的widgets组件作为动态链接库。
(8)此时,窗口类文件参与了编译,但是还并没有任何窗口被创建,因为窗口类在main函数里还没有任何实体对象。
下面修改qt_app_node.cpp文件,创建一个空窗口。
#include <qt_app_node.h>
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
(9)此时,编译程序,执行生成的可执行文件 qt_app__node,将会打开一个空窗口。
catkin_make
source devel/setup.bash
rosrun qt_app qt_app
使用qt5创建基本窗口的过程已经完成,剩下的是自己添加ros相关代码,并具体绘制窗口控件,这与普通的ros程序和qt程序是一模一样。
(10)除了使用roscamake的命令行编译运行程序以外,还可以使用qt creator打开运行该ros文件,使用qt打开src下面的makelist一般即可。详细见:
https://blog.csdn.net/ipfpm/article/details/88571925
(注意:
(1)如果不想使用ui文件,只用qt的类实现布局等的话,等按照步骤全部完成后,将有关ui的文件以及设置都去掉即可,也可显示窗口
(2)如果想要在qt中继续使用别的窗口类文件,则需要在camakelist文件中加入相关的qt5库(等待验证)
)
参考: