PCL点云之旅11 - 树形控件控制点云显示

1,077 阅读1分钟

实现效果

dcc6c346b664e84e3ba86e6053f643a.png

f699f363b0ed725706249f40b280685.jpg

实现思路

  1. 我们首先在场景中添加一个treeWidget
  2. 控制treeWidget在被选中的时候有不同的图标显示
  3. 在场景中定义两个变量,一个叫cloud_vec用来存放点云数组。一个叫cloud_index用来存放点云下标【存储01】。方便多个点云显示
  4. 给treeWidget添加槽函数。控制点击treeWidget的时候就调用这个函数
  5. 判断哪个cloud被选中。如果被选中,那么就改变cloud_index中的下标对应的元素为1,否则改变为0
  6. 如果说cloud_index为1的话,那么我们就控制点云显示
  7. 否则控制点云隐藏

代码实现

image.png

  • 实现逻辑
ainWindow::inittree(){
    // 设置树形控件控制模块
    QStandardItemModel *model=new QStandardItemModel(this);
    // 设置model到UI上面去
    ui->treeView->setModel(model);
    // 设置默认全部展开
    ui->treeView->expandAll();
    // 这里此处模块设置好了
    cloud_vec.push_back(cloud.makeShared());
    cloud_index.push_back(1);
    itemFolder = new QStandardItem(m_publicIconMap[QStringLiteral("treeItem_folder")],QStringLiteral("cloud%1").arg(cloud_vec.size()-1));
    itemFolder->setCheckable(true);
    itemFolder->setCheckState(Qt::Checked);//获取选中状态
    model->appendRow(itemFolder);
}
  • 槽函数
// 添加槽函数
void MainWindow::view_updata(std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> vector_cloud,std::vector<int> index)
{
    viewer->removeAllPointClouds();
    for(int i=0;i<vector_cloud.size();i++)
    {
        if(index[i]==1)
        {
            pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ>render(vector_cloud[i], "intensity");
            viewer->addPointCloud<pcl::PointXYZ>(vector_cloud[i],render,std::to_string(i));
            viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, point_size, std::to_string(i));
        }
    }
    //viewer->resetCamera();
    ui->qvtkWidget->update();
}



void MainWindow::on_treeView_clicked(const QModelIndex &index)
{

     //---------------点数数量更改------------------
     QStandardItemModel* model = static_cast<QStandardItemModel*>(ui->treeView->model());
     QStandardItem* item = model->itemFromIndex(index);
     //--------------可视化更改---------------------
     if(item == nullptr)
         return;
     if(item->isCheckable())
     {

         //判断状态
         Qt::CheckState state = item->checkState();//获取当前的选择状态

         if(Qt::Checked==state)
         {
             cloud_index[index.row()]=1;

         }

         if(Qt::Unchecked==state)
         {
             cloud_index[index.row()]=0;
         }

         view_updata(cloud_vec,cloud_index);

     }


}