一、主要流程
示例: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();//更新点云数据
}