《Qt+PCL》1.4、添加点云树形控件

一、主要流程

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、使用步骤

1. 控件更改

属性所在的控件从textBrowser替换为treeView,布局如下:
在这里插入图片描述

2.代码修改

mainwindow.h文件添加如下代码:

#include <QStandardItemModel>
#include <vector>
///******** 图标宏设定 ***********///
#ifndef TREE_ITEM_ICON_DataItem
#define TREE_ITEM_ICON_DataItem QStringLiteral("treeItem_folder")
#endif
private slots:
   //TreeView
    void on_treeView_clicked(const QModelIndex &index);
private:
    QStandardItemModel *model;
    QStandardItem *itemFolder;
    QMap<QString, QIcon> m_publicIconMap; // 存放公共图标

mainwindow.cpp文件添加如下代码:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
///************ 初始化TreeView控件 ******************
    m_publicIconMap[TREE_ITEM_ICON_DataItem] = QIcon(QStringLiteral("Icons/floder.pnf"));
    model = new QStandardItemModel(ui->treeView);
    model->setHorizontalHeaderLabels(QStringList()<<QStringList("--cloud--DB-Tree--"));
    ui->treeView->setHeaderHidden(true);

    ui->treeView->setModel(model);
    ui->treeView->setSelectionMode(QAbstractItemView::ExtendedSelection);//设置多选
}

///************** 打开点云 函数做如下修改:
void MainWindow::on_actionOpen_triggered()
{
    QString filename = QFileDialog::getOpenFileName(this, tr("open file"), "", tr("pcb file(*.pcd *.ply *.txt);;All file (*.*)"));
    //QString filename = QFileDialog::selectedFiles(this);

    if(filename.isEmpty()){
        return;
    }

    if(filename.endsWith("ply")){
        qDebug()<<filename;
        if(pcl::io::loadPLYFile<pcl::PointXYZRGB>(filename.toStdString(), cloud) == -1){
            qDebug()<<"Cloudn't read file \n";
            return;
        }
    }
    else if(filename.endsWith("pcd")){
        qDebug()<<filename;
        if(pcl::io::loadPCDFile<pcl::PointXYZRGB>(filename.toStdString(), cloud) == -1){
            qDebug()<<"Cloudn't read file \n";
            return;
        }
    }
    else if(filename.endsWith("txt")){
         qDebug()<<filename;
         pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudTemp(new pcl::PointCloud<pcl::PointXYZRGB>);
         CreateCloudFromTxt(filename.toStdString(), cloudTemp);
         cloud = *cloudTemp;
    }
    // else{
    //     QMessageBox::warning(this, "Warning", "点云读取格式错误!");
    // }

    //TreeView控件同步,读取点云的时候显示全部,不用没出息只显示单个点云
    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);//将 itemFolder 添加到 model 中作为一行
    //-------------------------------------------------
    int size = static_cast<int>(cloud.size());
    QString PointSize = QString("%1").arg(size);

    ui->textBrowser_2->clear();
    //ui->textBrowser_2->insertPlainText(QString("点云点数:%1").arg(PointSize));
    ui->textBrowser_2->insertPlainText("点云数量: "+PointSize);
    qDebug()<<QString("点云点数:%1").arg(PointSize);
    ui->textBrowser_2->setFont(QFont("Arial", 9, QFont::Normal));

    //移除窗口内点云数据
    // viewer->removeAllPointClouds();
    // viewer->removeAllShapes();

    viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false));
    vtkNew<vtkGenericOpenGLRenderWindow> window;
    window->AddRenderer(viewer->getRendererCollection()->GetFirstRenderer());
    ui->openGLWidget->setRenderWindow(window.Get());
    viewer->setupInteractor(ui->openGLWidget->GetInteractor(), ui->openGLWidget->GetRenderWindow());

    //-------------------------------
    viewer->addPointCloud<pcl::PointXYZRGB>(cloud.makeShared(),cloud_name[0]);
    viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, point_size, cloud_name[0]);
    viewer->addCoordinateSystem(0.2);

    viewer->resetCamera();
    ui->openGLWidget->update();
}
///*************************** 树形控件 ****************************

void MainWindow::on_treeView_clicked(const QModelIndex &index)
{
    QStandardItem* item = model->itemFromIndex(index);

    //---------------- 点云数量更改 ----------------------
    QStandardItemModel* model = static_cast<QStandardItemModel*>(ui->treeView->model());
    QModelIndex index_temp = ui->treeView->currentIndex();

    int size = static_cast<int>(cloud_vec[index_temp.row()]->size());
    QString PointSize = QString("%1").arg(size);

    ui->textBrowser_2->clear();
    //ui->textBrowser_2->insertPlainText(QString("点云点数:%1").arg(PointSize));
    ui->textBrowser_2->insertPlainText("点云数量: "+PointSize);
    ui->textBrowser_2->setFont(QFont("Arial", 9, QFont::Normal));

    //---------------- 可视化更改--------------
    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);
    }
}
void MainWindow::view_updata(std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> vector_cloud, std::vector<int> index){

    viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false));
    vtkNew<vtkGenericOpenGLRenderWindow> window;
    window->AddRenderer(viewer->getRendererCollection()->GetFirstRenderer());
    ui->openGLWidget->setRenderWindow(window.Get());

    viewer->removeAllPointClouds();
    viewer->removeAllShapes();
    for(int i=0; i<vector_cloud.size(); i++){
        if(index[i] == 1){
            pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZRGB>render(vector_cloud[i], "intensity");
            viewer->addPointCloud<pcl::PointXYZRGB>(vector_cloud[i], std::to_string(i));
            viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, point_size, std::to_string(i));
            viewer->addCoordinateSystem(0.2);
        }
    }
    ui->openGLWidget->update();//更新点云数据
}

参考资料如下:

《QT+PCL》补充——添加点云树形控件
Qt QTreeView 详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钟某某人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值