ROS-Qt-转CMake编译以及qmake第三方库添加及其他

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填(自己取)
  • Distributionmelodic(根据自己所在系统填)
  • Build SystemCatkinMake
  • Workspace Path : 选上面步骤1创建的catkin_qt文件夹,不要选到src
  • Next
  • 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的目录下(其实 确保 libinclude 文件夹在同一目录下即可)
  • 然后在QtCreater界面,点击.pro,在.pro界面下右键——>添加库
    ROS-Qt-转CMake编译以及qmake第三方库添加及其他_第1张图片
  • 选择外部库,然后下一步
    ROS-Qt-转CMake编译以及qmake第三方库添加及其他_第2张图片
  • 然后库文件选择路径,即是 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

。。。。。。。 持续更新中

你可能感兴趣的:(Qt,ROS探索,qt,开发语言,c++,ros)