首先我们先进行ui设计:
在两个主页面添加两个页,名称改为rviz,在curentTabText里面修改
然后在电池电量下面那个rviz的页面中加入一个treewidget,给他纵向布局,修改大小header headerdefualt 150,headerMin…150;
开始写代码:
(1)在main_window.cpp中进行添加ui设计:先看看rviz中的有哪些控件,我们之创建一部分
在main_window.cpp中设计一系列rviz的组件,其中要注意的是:
为了在这个文件中都能使用: QComboBox* fixed_box;所以需要这句话在main_window.hpp中声明:
QComboBox* fixed_box;
还需要导入头文件
#include <QComboBox> //10-2
然后继续写代码:
//rviz设计10-1
// ui.treeWidget->setWindowTitle("Display");
// ui.treeWidget->setWindowIcon(QIcon("://images/classes/Displays.svg"));
//header
ui.treeWidget->setHeaderLabels(QStringList()<<"key"<<"value");
ui.treeWidget->setHeaderHidden(true); //隐藏key value
//GLobal Options
QTreeWidgetItem* Global=new QTreeWidgetItem(QStringList()<<"Global Options");
Global->setIcon(0,QIcon("://images/options.png"));
ui.treeWidget->addTopLevelItem(Global);
Global->setExpanded(true); //设置为展开状态
//FixFrame
QTreeWidgetItem* Fixed_frame=new QTreeWidgetItem(QStringList()<<"Fixed Frame");
fixed_box=new QComboBox();
fixed_box->addItem("map");
fixed_box->setMaximumWidth(150);
fixed_box->setEditable(true);
connect(fixed_box,SIGNAL(currentTextChanged(QString)),this,SLOT(slot_treewidget_value_change(QString)));
Global->addChild(Fixed_frame);
ui.treeWidget->setItemWidget(Fixed_frame,1,fixed_box);
(2)创建qrviz类:
注意勾选继承QObject那个类
在这里,照着视频做,把qrviz.hpp给放在include目录下,把qrviz.cpp放在src目录下,发现qt编译后,在include目录下,宾没有qrviz.hpp文件,经过测试,发现把qrviz.hpp也放在
接下来我们在qrviz.hpp中包含ROS的头文件和rviz的相关头文件:
#include <ros/ros.h> //10-3
#include <rviz/visualization_manager.h>
#include <rviz/render_panel.h>
#include <rviz/display.h>
#include <rviz/tool_manager.h>
#include <rviz/tool.h>
#include <QVBoxLayout>
创建rviz::RenderPanel* render_panel_;显示容器,因为他是继承与QWidget这个类,所以我们可以像操作QWidget那样,去操作rviz::RenderPanel
在qrviz.hpp中建立一个私有的
rviz::RenderPanel* render_panel_;
在qrviz.cpp中实例化
//创建rviz panel
render_panel_=new rviz::RenderPanel();
接下来这里注意理解:
//分析,这是在两个类中,我们需要在main_window这个类中显示 render_panel,也就是在layout_rviz上显示render_panel
//怎么把他们两个联系起来呢,通过构造函数,在初始化对象的时候传入一个layout指针。通过这个指针去添加widget,所以我们需要
//去hpp文件更改一下构造函数传入的参数,需要在qrviz.hpp包含#include <QVBoxLayout>
并且:在qrviz.hpp中
//传入QVBoxLayout指针对象
qrviz(QVBoxLayout* layout);
只记录重点了:
在main_window.cpp中初始化my_rviz这个类,在连接master的两种方式的地方都要初始化:
//初始化my_rviz
myrviz=new qrviz(ui.layout_rviz);
在qrviz.hpp中创建一个私有的:
rviz::VisualizationManager* manager_;
ui.treeWidget->setEnabled(true);