QFileDialog选择txt和.cpp
时间: 2024-01-12 20:46:16 浏览: 164
您可以使用`QFileDialog`类的`setFilter`函数设置过滤器,以便只显示`.txt`和`.cpp`文件。以下是一个示例代码:
```cpp
QStringList fileFilters;
fileFilters << "Text files (*.txt)" << "C++ files (*.cpp)";
QString selectedFilter;
QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Open File"), QDir::homePath(), fileFilters.join(";;"), &selectedFilter);
```
`getOpenFileNames`函数会弹出一个打开文件对话框,用户可以选择一个或多个文件。`setFilter`函数中的第四个参数是过滤器字符串,它以两个分号分隔不同的过滤器。`selectedFilter`参数将包含用户选择的过滤器,可以用于进一步处理选定的文件。
相关问题
QString File_Path = QFileDialog::getOpenFileName(this, "open","../","source(*.cpp *.h *.DAT *.mat);;Text(*.txt);;all(*.*)");这个程序怎么选择路径
这段代码是使用Qt框架提供的QFileDialog类来打开一个文件选择对话框,让用户选择需要打开的MAT文件。当用户在对话框中选择了一个文件后,QFileDialog::getOpenFileName函数会返回该文件的绝对路径,并将其保存在变量File_Path中。
具体而言,该函数的第一个参数为QWidget类型的parent对象,用于指定文件对话框的父窗口。在这里,this指针表示当前窗口是文件对话框的父窗口,即文件对话框将在当前窗口上打开。第二个参数是对话框的标题,这里为"open"。第三个参数是对话框打开时显示的目录,这里为上一级目录"../"。第四个参数是过滤器,用于指定文件类型。在这里,过滤器分为三类:source(*.cpp *.h *.DAT *.mat)表示源文件类型(.cpp、.h、.DAT和.mat文件),Text(*.txt)表示文本文件类型(.txt文件),all(*.*)表示所有文件类型。用户在文件对话框中选择一个文件后,函数会返回该文件的绝对路径。
因此,当程序运行到这段代码时,会弹出一个文件对话框,用户可以在其中选择需要打开的MAT文件,然后程序会获取该文件的绝对路径并保存在变量File_Path中。
在cloudcompare的mainwindow.cpp中,用C++定义一个函数void MainWindow::DBH(),基于最小二乘法,通过获取当前选中的实体作为点云文件来源,实现对txt格式的树木点云文件的胸径计算
可以参考以下代码实现:
```cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cmath>
#include <QFileDialog>
#include <QMessageBox>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<PointT> PointCloudT;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//连接信号与槽函数
connect(ui->actionOpen, SIGNAL(triggered(bool)), this, SLOT(openFile()));
connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(DBH()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::openFile()
{
QString fileName = QFileDialog::getOpenFileName(this, tr("Open Point Cloud"), "", tr("Point Cloud Files (*.pcd *.txt)"));
if(!fileName.isEmpty())
{
//清空界面
ui->qvtkWidget->update();
ui->textBrowser->clear();
//读取点云文件
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>(fileName.toStdString(), *cloud) == -1)
{
//尝试读取txt格式文件
std::ifstream ifs(fileName.toStdString());
if (!ifs.is_open())
{
QMessageBox::critical(this, "Error", "Cannot open file!");
return;
}
std::string line;
while (std::getline(ifs, line))
{
pcl::PointXYZ p;
std::stringstream ss(line);
ss >> p.x >> p.y >> p.z;
cloud->push_back(p);
}
ifs.close();
}
//显示点云
pcl::visualization::PCLVisualizer vis("Point Cloud");
vis.setBackgroundColor(0.0, 0.0, 0.0);
vis.addPointCloud(cloud, "cloud");
vis.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "cloud");
ui->qvtkWidget->update();
//输出点云信息
std::stringstream ss;
ss << "Number of points: " << cloud->size() << std::endl;
ui->textBrowser->append(ss.str().c_str());
//保存点云
cloud_ = cloud;
}
}
void MainWindow::DBH()
{
if (!cloud_)
{
QMessageBox::warning(this, "Warning", "No point cloud selected!");
return;
}
//获取选中的点
std::vector<int> indices;
if (ui->qvtkWidget->getRenderWindow()->GetRenderers()->GetFirstRenderer()->GetViewProp("cloud"))
{
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor = ui->qvtkWidget->getRenderWindow()->GetRenderers()->GetFirstRenderer()->GetActors()->GetLastActor();
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper = vtkPolyDataMapper::SafeDownCast(actor->GetMapper());
vtkSmartPointer<vtkDataSet> dataSet = vtkSmartPointer<vtkDataSet>::New();
dataSet = mapper->GetInput();
vtkSmartPointer<vtkUnsignedCharArray> pointColors = vtkSmartPointer<vtkUnsignedCharArray>::New();
pointColors = vtkUnsignedCharArray::SafeDownCast(dataSet->GetPointData()->GetScalars());
for (vtkIdType i = 0; i < pointColors->GetNumberOfTuples(); i++)
{
if (pointColors->GetValue(i) == 255)
{
indices.push_back(i);
}
}
}
if (indices.empty())
{
QMessageBox::warning(this, "Warning", "No point selected!");
return;
}
//计算胸径
double sum_x = 0.0, sum_y = 0.0, sum_z = 0.0, sum_xy = 0.0, sum_xz = 0.0, sum_xx = 0.0;
for (int i : indices)
{
sum_x += cloud_->points[i].x;
sum_y += cloud_->points[i].y;
sum_z += cloud_->points[i].z;
sum_xx += cloud_->points[i].x * cloud_->points[i].x;
sum_xy += cloud_->points[i].x * cloud_->points[i].y;
sum_xz += cloud_->points[i].x * cloud_->points[i].z;
}
double n = static_cast<double>(indices.size());
double a = (n * sum_xy - sum_x * sum_y) / (n * sum_xx - sum_x * sum_x);
double b = (sum_y - a * sum_x) / n;
double c = (n * sum_xz - sum_x * sum_z) / (n * sum_xx - sum_x * sum_x);
double d = (sum_z - c * sum_x) / n;
double D = 2.0 * sqrt(a * a + 1) * 1000.0; //单位:毫米
//输出胸径
std::stringstream ss;
ss << "DBH: " << D << " mm" << std::endl;
ui->textBrowser->append(ss.str().c_str());
}
```
该函数基于最小二乘法,通过获取当前选中的实体作为点云文件来源,实现对txt格式的树木点云文件的胸径计算。
阅读全文