Qt 开发ROS 界面的方法
方法2 带ui的工作空间配置(以ROS节点执行)
步骤1
$ mkdir catkin_qt
$ cd catkin_qt
$ mkdir src
$ cd src
$ catkin_init_workpasce
$ cd ..
$ catkin_make
$ cd src
$ catkin_create_qt_pkg ros_ui roscpp rospy std_msgs
$ cd ..
$ catkin_make
...提示:build target ros_ui 即可
- 如果提示: catkin_create_qt_pkg 找不到 则:
sudo apt-get install ros-melodic-qt-create
sudo apt-get install ros-melodic-qt-build
步骤2
打开qtcreate,前提是带ros创建的
这里我下载的已经配置好的qtcreator(离线与在线都行,离线我觉的快点)
https://ros-qtc-plugin.readthedocs.io/en/latest/_source/How-to-Install-Users.html#qt-installer-procedure
这个只是个QtCreater ,之前没装Qt的还是得装一个
- 新建项目
other project
——>ROS Workspace
- Name填(自己取)
Distribution
填melodic
(根据自己所在系统填)Build System
填CatkinMake
Workspace Path
: 选上面步骤1创建的catkin_qt文件夹,不要选到srcNext
- Add to version control 填:Git (可以不选,即None)
Finish
建立完成,下面修改编译配置
- 点击左边的 Project(扳手图)
- Build不变(检查一下是不是catkin_make)
- Run 中修改, 运行配置选:ROS Run Configuration
Add Run Step
——>ROS run step
, 会出现三个选项 (如果是运行launch
也是在这里选)Package
选 步骤1 的功能包名: 如ros_ui
Target
默认选 ros_qt (默认的那个,在CMakeList中觉得的), 第三个不填- 返回编辑界面,点击左下角的 “锤子” 编译
- 此时再开一个终端,打开 roscore
- 会到 Qt 点击左边的运行即可
- 以上步骤 是默认Qt4,改Qt5 编译见下面
- 在此基础上上的ui
加新控件
,一定要 在终端用catkin_make
确保生成了新的ui_xxx.h
才行
终端看到打印了[ 6%] Generating ui_form.h
这样的信息才行
新增界面 并以Qt5 加载*
- 1)右击 ros_ui (功能包)—— > Add New 。。
- 2)选一个基类。其他(一定确保新建的路径在ros_ui下,不是在ros_ui 的子目录下)
- 3)然后把
.h
.cpp
.ui
拉到对应的文件夹里 - 4)【非常重要】修改CMakeList.txt
##############################################################################
# CMake
##############################################################################
cmake_minimum_required(VERSION 2.8.0)
project(qt_ui)
# 新增(Qt5)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
#添加c++11的支持 新增(Qt5)
set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
##############################################################################
# Catkin
##############################################################################
# qt_build provides the qt cmake glue, roscpp the comms for a default talker
# 这里和 ros 添加依赖功能包一样
find_package(catkin REQUIRED COMPONENTS qt_build roscpp tf
sensor_msgs
cv_bridge
std_msgs
image_transport
)
include_directories(${catkin_INCLUDE_DIRS} ./include) # (Qt5)
# Use this to define what the package will export (e.g. libs, headers).
# Since the default here is to produce only a binary, we don't worry about
# exporting anything.
catkin_package()
##############################################################################
# Qt Environment
##############################################################################
# this comes from qt_build's qt-ros.cmake which is automatically
# included via the dependency call in package.xml
# rosbuild_prepare_qt4(QtCore QtGui) # Add the appropriate components to the component list here
## 安装多个 Qt 版本时, 可能会导致无法使用特定的 Qt 版本. 需要设置 CMAKE_PREFIX_PATH 为所用 Qt 的安装路径, 但是还需要设置 Qt[Module]_DIR(例如: QtCore_DIR) 等变量. 下面这一段代码自动会修改 ModuleList 中的所有模块, 并自动设置 Qt[Module]_DIR变量; 同时 target_link_libraries.
# 如果是使用已经安装了ros_plugins_ros 的qtcreater的 最后是选择你Qt 的安装路径(就是找到/lib/cmake文件) # (Qt5)
set(CMAKE_PREFIX_PATH "/opt/qt512")
set(ModuleList # 需要加Qt 的 模块就在这里添加,和Qt 的 .pro 的 QT += Core一样
Core
Gui
Widgets
Network
)
foreach(QtModule ${ModuleList})
set(Qt5${QtModule}_DIR ${CMAKE_PREFIX_PATH}/lib/cmake/Qt5${QtModule})
message("foreach-> Qt5${QtModule}_DIR : ${Qt5${QtModule}_DIR}")
set(QT_LIBRARIES ${QT_LIBRARIES} Qt5::${QtModule})
endforeach()
message("${QT_LIBRARIES}")
find_package(Qt5 REQUIRED ${ModuleList})
##############################################################################
# Sections
##############################################################################
file(GLOB QT_FORMS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ui/*.ui)
file(GLOB QT_RESOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} resources/*.qrc)
file(GLOB_RECURSE QT_MOC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} FOLLOW_SYMLINKS include/qt_ui/*.hpp *.h) # 这里新增 *.h (新建界面)
# 将QT4 改成 QT5 (Qt5)
QT5_ADD_RESOURCES(QT_RESOURCES_CPP ${QT_RESOURCES})
QT5_WRAP_UI(QT_FORMS_HPP ${QT_FORMS})
QT5_WRAP_CPP(QT_MOC_HPP ${QT_MOC})
##############################################################################
# Sources
##############################################################################
file(GLOB_RECURSE QT_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} FOLLOW_SYMLINKS src/*.cpp)
##############################################################################
# Binaries
##############################################################################
add_executable(qt_ui ${QT_SOURCES} ${QT_RESOURCES_CPP} ${QT_FORMS_HPP} ${QT_MOC_HPP})
target_link_libraries(qt_ui ${QT_LIBRARIES} ${catkin_LIBRARIES})
install(TARGETS qt_ui RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
- 5)修改头文件(form是新建的),自动补偿选第一个form.h,一定先做这一步再继续下面的
#include "../include/ros_ui/form.h"
- 6)保存了后,先在终端当工作空间 使用
catkin_make
,终端直到看到终端提示生成了 ui_xxx.h 才行,这里如ui_from.h 不然是找不到 .ui 中的控件的, 比如:
[ 6%] Generating ui_form.h
不要直接使用“锤子”因为 80%是不得行,关键就是看build
文件夹的对应功能包名下是否生成了ui_xxx.h
- 7)在
.ui
中加新的控件,都有按照上一步(6)说的来,反正就是要看到生成了ui_xxx.h
才行
如何添加第三方库
- 这个部分是对纯Qt以 qmake 执行的程序而言的
- 以 后面我将要提到的QSsh 这种第三方库的添加为例
- 首先确保生成了QSsh 的
lib
文件(中含.so或者.dll),然后把lib
文件夹和include
文件夹都放到qt的同.cpp.h的目录下(其实 确保lib
和include
文件夹在同一目录下即可) - 然后在QtCreater界面,点击.pro,在.pro界面下右键——>添加库
- 选择外部库,然后下一步
- 然后库文件选择路径,即是 lib 下的,点到 lib 下 会有对应的文件可供点,如果lib 和 include 在同一目录下 下面的包含路径会自己填充include 的路径
- 然后是什么平台就勾选哪个平台就行了。我这里是以 Linux 为例的
- 完成后 编译器会自己给你的.pro中加入连接语句,保存后编译即可用
- 注意在调用头文件时用
""
,同时不一定直接就是对应的头文件名,有可能是多层头文件比如:
所以可尝试一下。
#include "ssh/sshconnection.h"
- 这就算是完成了
开发中出现的知识
(1)自定义信号
xx.h 中
class MainWindow : public QMainWindow
{
Q_OBJECT
。。。。
signals: // 关键字signals 或者 Q_SIGNALS 也可
void display();
void isconnect(int x, float y);
void isconnect(int, float);
。。。
};
xx.cpp 中
void MainWindow::test(){
emit display(); //使用 emit 关键字 就可发送信号了
emit isconnect(10,10.1);
}
(2)QCoreApplication::processEvents();
QCoreApplication::processEvents();
(3)QSetting 的用法
- 其实没有特别的去知道的深入作,比较简单就是,能够保存设置
最常用的就是公司与组织的关系
(4)Qt 信号与槽的 Lambda 描述
# Qt4 以前的信号与槽
connect(信号发出对象, SIGNAL(信号),信号接收对象, SLOT(槽函数对象))
(5)QProcess 与 Qt与终端交互
(6)Qt 与 第三方库QSsh 开发 ssh
。。。。。。。 持续更新中