在ros中使用qt图形界面

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在ros中使用qt图形界面相关的知识,希望对你有一定的参考价值。

在ROS中使用QT界面

在终端可以直接用catkin_create_qt_pkg命令创建带Qt界面的ROS package,再按照前面说的方法导入到Qt即可
这里参考的是qt_createTutorialsQt App Templates  

(1) 要使用catkin_create_qt_pkg命令需要安装一个包,执行如下命令:

$ sudo apt-get install ros-indigo-qt-ros11

这样我就可以使用catkin_create_qt_pkg命令创建一个名为testgui的package

$ cd catkin_qtwstest/src/$ catkin_create_qt_pkg testgui1212

如下图

技术分享

(2) 按照上述方式重新把catkin_qtwstest工作空间导入到Qt中,如下图

技术分享

在左侧的树状图可以看到testgui下的目录结构,自动生成的main.cppmain_window.cppqnode.cppmain_window.ui包含Qt界面的基本元素
(3) 要运行testgui节点先启动一个roscore,如图

$ roscore11

技术分享

然后点击Qt左下角的绿色三角形运行testgui节点,如下图

技术分享

根据roscore的ROS_MASTER_URI填写UI界面上的ROS_MASTER_URI,然后点击“connect”,testgui节点开始在名为/chatter的topic上发送字符串如图


建立新的多层级窗口

这里首先叙述一下qt中QWidget,QMainWindow,QDialog的区别。

QWidget类是所有用户界面对象的基类。 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上绘制自己。每一个窗口部件都是矩形的,并且它们按Z轴顺序排列。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。 

    QMainWindow 类提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。主窗口通常用在提供一个大的中央窗口部件(例如文本编辑或者绘制画布)以及周围 菜单、工具条和一个状态条。QMainWindow常常被继承,因为这使得封装中央部件、菜单和工具条以及窗口状态条变得更容易,当用户点击菜单项或者工具条按钮时,槽会被调用。

    QDialog类是对话框窗口的基类。对话框窗口是主要用于短期任务以及和用户进行简要通讯的顶级窗口。QDialog可以是模态对话框也可以是非模态对话框。QDialog支持扩展性并且可以提供返回值。它们可以有默认按钮。QDialog也可以有一个QSizeGrip在它的右下角,使用setSizeGripEnabled()。 

    QDialog 是最普通的顶级窗口。一个不会被嵌入到父窗口部件的窗口部件叫做顶级窗口部件。通常情况下,顶级窗口部件是有框架和标题栏的窗口(尽管使用了一定的窗口部件标记,创建顶级窗口部件时也可能没有这些装饰。)在Qt中,QMainWindow和不同的QDialog的子类是最普通的顶级窗口。

    如果是顶级对话框,那就基于QDialog创建,如果是主窗体,那就基于QMainWindow,如果不确定,或者有可能作为顶级窗体,或有可能嵌入到其他窗体中,则基于QWidget创建。
    当然了,实际中,你还可以基于任何其他部件类来派生。看实际需求了,比如QFrame、QStackedWidget等等。


添加窗体(在同一级目录中)

由于ros的特性,不同package之间是可以利用ros本身的机制进行通信,所以数个窗体是可以放到同一级package中的。

实际工程使用中必定使用多个窗体来对实施工程,所以需要增加图形窗口,这里直接使用QT自带的窗口class类来进行添加。

这里在ros2opencv中添加类facedialog,

1.将.h文件改为.hpp文件,通过系统的文件管理器将各个文件放到相应的目录中,如图

2.在ros2opencv下的CMakeList.txt中add_executable()中添加src/facedialog.cpp变为

add_executable(ros2opencv  src/main.cpp src/main_window.cpp src/qnode.cpp src/facedialog.cpp     

    ${QT_FORMS_HPP} ${QT_MOC_HPP})

3.在main_window.hpp中添加#include "../include/ros2opencv/facedialog.hpp"

因为这里想通过main_window.ui中的按钮来调出faceDialog窗口,所以在main_window.hpp中的public中还要添加faceDialog faceDialogForm;

4.在facedialog.hpp中添加#include "ui_facedialog.h"

5.将facedialog.cpp中的#include "ui_facedialog.h"去除

6.因为文件进行了改动,所以要把文件夹build中所有的东西删除,之后再进行构建。

7.之后的对窗体的操作和qt使用窗体的方式一样。


添加窗体(在不同级目录添加,互相调用,这块想实现的功能未实现)

工程中需要图形窗口处在不同的目录中进行互相调用,如下,在body_detect中添加窗口类bodydialog

1.同样要先将.h改名为.hpp,之后放到对应的目录中。

2.之后编译会出现如下的报错

QDialog: No such file or directory

这里需要在body_detect中的CMakeList.txt的catkin_package()之后添加

rosbuild_prepare_qt4(QtCore QtGui)

3.编译时出现这样的错误

ui_bodydialog.h: No such file or directory




以上是关于在ros中使用qt图形界面的主要内容,如果未能解决你的问题,请参考以下文章

qt图形界面编程如何调用对象指针?

ROS通过图形化界面控制和查看小乌龟参数

技术分享 | 让ROS人机交互更加有趣--基于Qt+ROS开发

ROS订阅的topic如何通过tcp传送给QT并显示到界面上

Qt移植

ROS从入门到精通系列(二十八)-- ROS控制器图形化界面开发