实现效果


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

ainWindow::inittree(){
QStandardItemModel *model=new QStandardItemModel(this);
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));
}
}
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);
}
}