
#include <QString>
#include <QFile>
#include <QFileDialog>
#include <QDir>
// //main.cpp
//#include <QApplication>
//#include <QtDataVisualization>
//#include <QWidget>
//#include <QVBoxLayout>
//#include <QPushButton>
//using namespace QtDataVisualization;
//class SurfaceViewer : public QWidget {
// Q_OBJECT
//public:
// explicit SurfaceViewer(QWidget *parent = nullptr) : QWidget(parent) {
// // 初始化3D视图
// Q3DSurface *surface = new Q3DSurface();
// QWidget *container = QWidget::createWindowContainer(surface);
// // 设置UI布局
// QVBoxLayout *layout = new QVBoxLayout(this);
// layout->addWidget(container, 1);
// // 初始化数据序列
// QSurfaceDataProxy *proxy = new QSurfaceDataProxy();
// QSurface3DSeries *series = new QSurface3DSeries(proxy);
// series->setDrawMode(QSurface3DSeries::DrawSurfaceAndWireframe);
// surface->addSeries(series);
// // 生成示例点云数据(正弦波形)
// generateDemoData(proxy);
// // 配置3D场景
// setupScene(surface);
// // 添加控制按钮
// addControlButtons(layout, surface);
// }
//private:
// void generateDemoData(QSurfaceDataProxy *proxy) {
// // 生成100x100点阵数据
// const int rows = 100;
// const int cols = 100000;
// QSurfaceDataArray *dataArray = new QSurfaceDataArray;
// dataArray->reserve(rows);
// for (float i = -50; i < 50; i += 1.0f) {
// QSurfaceDataRow *row = new QSurfaceDataRow(cols);
// float z = i * 0.2f;
// for (int j = 0; j < cols; j++) {
// float x = j * 0.2f - 10.0f;
// float y = 5.0f * qSin(qSqrt(x*x + z*z));
// (*row)[j].setPosition(QVector3D(x, y, z));
// }
// dataArray->append(row);
// }
// proxy->resetArray(dataArray);
// }
// void setupScene(Q3DSurface *surface) {
// // 配置坐标轴标签
// QValue3DAxis *axisX = surface->axisX();
// QValue3DAxis *axisY = surface->axisY();
// QValue3DAxis *axisZ = surface->axisZ();
// // 设置轴名称
// axisX->setTitle("X Axis");
// axisY->setTitle("Y Axis");
// axisZ->setTitle("Z Axis");
// // 可选:设置标签显示样式
// axisX->setTitleVisible(true);
// axisY->setTitleVisible(true);
// axisZ->setTitleVisible(true);
// // 设置轴范围(示例数据适配)
// axisX->setRange(-10, 10);
// axisY->setRange(-50, 50);
// axisZ->setRange(-10, 10);
// }
// void addControlButtons(QVBoxLayout *layout, Q3DSurface *surface) {
// QHBoxLayout *btnLayout = new QHBoxLayout;
// QPushButton *zoomIn = new QPushButton("Zoom In");
// QPushButton *zoomOut = new QPushButton("Zoom Out");
// QPushButton *rotateLeft = new QPushButton("← Rotate");
// QPushButton *rotateRight = new QPushButton("Rotate →");
// // 修正缩放控制
// connect(zoomIn, &QPushButton::clicked, [surface]() {
// surface->scene()->activeCamera()->setZoomLevel(
// qMin(surface->scene()->activeCamera()->zoomLevel() * 1.1f, 500.0f) // 限制最大500%
// );
// });
// connect(zoomOut, &QPushButton::clicked, [surface]() {
// surface->scene()->activeCamera()->setZoomLevel(
// qMax(surface->scene()->activeCamera()->zoomLevel() * 0.9f, 10.0f) // 限制最小10%
// );
// });
// connect(rotateLeft, &QPushButton::clicked, [surface](){
// surface->scene()->activeCamera()->setXRotation(surface->scene()->activeCamera()->xRotation() - 10);
// });
// connect(rotateRight, &QPushButton::clicked, [surface](){
// surface->scene()->activeCamera()->setXRotation(surface->scene()->activeCamera()->xRotation() + 10);
// });
// btnLayout->addWidget(zoomIn);
// btnLayout->addWidget(zoomOut);
// btnLayout->addWidget(rotateLeft);
// btnLayout->addWidget(rotateRight);
// layout->addLayout(btnLayout);
// }
//};
//int main(int argc, char *argv[]) {
// QApplication app(argc, argv);
// // 设置OpenGL格式
// QSurfaceFormat format;
// format.setSamples(8);
// QSurfaceFormat::setDefaultFormat(format);
// SurfaceViewer viewer;
// viewer.resize(800, 600);
// viewer.show();
// return app.exec();
//}
//#include "main.moc"
//#include <QApplication>
//#include <QtDataVisualization>
//#include <QWidget>
//#include <QVBoxLayout>
//#include <QPushButton>
//#include <QFile>
//#include <QTextStream>
//#include <QMessageBox>
//#include <QRegularExpression>
//#include <functional>
//using namespace QtDataVisualization;
//class ScatterViewer : public QWidget {
// Q_OBJECT
//public:
// explicit ScatterViewer(QWidget *parent = nullptr) : QWidget(parent) {
// Q3DScatter *scatter = new Q3DScatter();
// QWidget *container = QWidget::createWindowContainer(scatter);
// QVBoxLayout *layout = new QVBoxLayout(this);
// layout->addWidget(container, 1);
// QScatterDataProxy *proxy = new QScatterDataProxy();
// series = new QScatter3DSeries(proxy);
// scatter->addSeries(series);
// addControlButtons(layout, scatter);
// loadDataFromFile(scatter, "1235.txt");
// }
//private:
// QScatter3DSeries *series;
// void loadDataFromFile(Q3DScatter *scatter, const QString &filename) {
// QFile file(filename);
// if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
// QMessageBox::warning(this, "Error", "无法打开文件");
// return;
// }
// QScatterDataArray *dataArray = new QScatterDataArray;
// QTextStream in(&file);
// float minX = INFINITY, maxX = -INFINITY;
// float minY = INFINITY, maxY = -INFINITY;
// float minZ = INFINITY, maxZ = -INFINITY;
// int validLines = 0;
// const QRegularExpression re(
// "^\\s*([-+]?\\d+\\.?\\d*([eE][-+]?\\d+)?)\\s*;" // X值
// "\\s*([-+]?\\d+\\.?\\d*([eE][-+]?\\d+)?)\\s*;" // Y值
// "\\s*([-+]?\\d+\\.?\\d*([eE][-+]?\\d+)?)\\s*;" // Z值
// "\\s*$"
// );
// while (!in.atEnd()) {
// QString line = in.readLine().trimmed();
// if(line.isEmpty()) continue;
// QRegularExpressionMatch match = re.match(line);
// if(match.hasMatch()) {
// bool ok;
// //坐标变换
// float x = match.captured(1).toFloat(&ok);
// if(!ok) continue;
// float y = match.captured(5).toFloat(&ok);
// if(!ok) continue;
// float z = match.captured(3).toFloat(&ok);
// if(!ok) continue;
// // 更新坐标范围
// minX = qMin(minX, x);
// maxX = qMax(maxX, x);
// minY = qMin(minY, y);
// maxY = qMax(maxY, y);
// minZ = qMin(minZ, z);
// maxZ = qMax(maxZ, z);
// dataArray->append(QScatterDataItem(QVector3D(x, y, z)));
// validLines++;
// }
// }
// file.close();
// if(validLines == 0) {
// QMessageBox::warning(this, "Error", "文件格式不正确或没有有效数据");
// return;
// }
// // 可视化设置(点的大小)
// series->setItemSize(0.1f);
// series->setMesh(QAbstract3DSeries::MeshSphere);
// //series->setColor(Qt::blue);
// series->dataProxy()->resetArray(dataArray);
// // 设置坐标轴范围(带10%边距)
// auto addMargin = [](float min, float max) {
// float range = max - min;
// return range > 0 ? range * 0.1 : 1.0;
// };
// scatter->axisX()->setRange(minX - addMargin(minX, maxX), maxX + addMargin(minX, maxX));
// scatter->axisY()->setRange(minY - addMargin(minY, maxY), maxY + addMargin(minY, maxY));
// scatter->axisZ()->setRange(minZ - addMargin(minZ, maxZ), maxZ + addMargin(minZ, maxZ));
// scatter->axisX()->setTitle("X");
// scatter->axisY()->setTitle("Y");
// scatter->axisZ()->setTitle("Z");
// }
// void addControlButtons(QVBoxLayout *layout, Q3DScatter *scatter) {
// QHBoxLayout *btnLayout = new QHBoxLayout;
// // 修正1:使用标准function类型
// auto createButton = [&](const QString &text, std::function<void()> func) {
// QPushButton *btn = new QPushButton(text);
// connect(btn, &QPushButton::clicked, func);
// btnLayout->addWidget(btn);
// };
// // 修正2:使用正确的捕获方式
// createButton("Zoom In", [scatter] {
// scatter->scene()->activeCamera()->setZoomLevel(
// qMin(scatter->scene()->activeCamera()->zoomLevel() * 1.1f, 500.0f));
// });
// createButton("Zoom Out", [scatter] {
// scatter->scene()->activeCamera()->setZoomLevel(
// qMax(scatter->scene()->activeCamera()->zoomLevel() * 0.9f, 10.0f));
// });
// createButton(QString::fromLocal8Bit("← Rotate"), [scatter] {
// scatter->scene()->activeCamera()->setXRotation(
// scatter->scene()->activeCamera()->xRotation() - 10);
// });
// createButton(QString::fromLocal8Bit("Rotate →"), [scatter] {
// scatter->scene()->activeCamera()->setXRotation(
// scatter->scene()->activeCamera()->xRotation() + 10);
// });
// layout->addLayout(btnLayout);
// }
// };
//int main(int argc, char *argv[]) {
// QApplication app(argc, argv);
// QSurfaceFormat format;
// format.setSamples(8);
// QSurfaceFormat::setDefaultFormat(format);
// ScatterViewer viewer;
// viewer.resize(1000, 800);
// viewer.setWindowTitle(QString::fromLocal8Bit("3D点云查看器"));
// viewer.show();
// return app.exec();
//}
//#include "main.moc"
//#include <QApplication>
//#include <QtDataVisualization>
//#include <QWidget>
//#include <QVBoxLayout>
//#include <QPushButton>
//#include <QFile>
//#include <QTextStream>
//#include <QMessageBox>
//#include <QRegularExpression>
//using namespace QtDataVisualization;
//class SurfaceViewer : public QWidget {
// Q_OBJECT
//public:
// explicit SurfaceViewer(QWidget *parent = nullptr) : QWidget(parent) {
// // 初始化3D散点图视图
// Q3DScatter *scatter = new Q3DScatter();
// QWidget *container = QWidget::createWindowContainer(scatter);
// // 设置UI布局
// QVBoxLayout *layout = new QVBoxLayout(this);
// layout->addWidget(container, 1);
// // 初始化数据系列
// QScatterDataProxy *proxy = new QScatterDataProxy();
// series = new QScatter3DSeries(proxy);
// scatter->addSeries(series);
// // 添加控制按钮
// addControlButtons(layout, scatter);
// // 或者自定义主题属性
// Q3DTheme *customTheme = new Q3DTheme(Q3DTheme::ThemeStoneMoss);
// customTheme->setBackgroundEnabled(false);
// customTheme->setLightStrength(0); // 减弱光源强度
// // 加载点云数据文件
// //loadDataFromFile( "999.txt");
// }
//private:
// Q3DScatter *scatter = new Q3DScatter() ; // 添加成员变量
// QScatter3DSeries *series;
// QWidget *container = QWidget::createWindowContainer(scatter);
// QScatterDataProxy *proxy = new QScatterDataProxy();
// void loadDataFromFile( const QString &filename) {
// QFile file(filename);
// if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
// QMessageBox::warning(this, "Error", "无法打开文件");
// return;
// }
// QScatterDataArray *dataArray = new QScatterDataArray;
// QTextStream in(&file);
// float minX = INFINITY, maxX = -INFINITY;
// float minY = INFINITY, maxY = -INFINITY;
// float minZ = INFINITY, maxZ = -INFINITY;
// int validLines = 0;
// const QRegularExpression re(
// "^\\s*([-+]?\\d+\\.?\\d*([eE][-+]?\\d+)?)\\s*;" // X值
// "\\s*([-+]?\\d+\\.?\\d*([eE][-+]?\\d+)?)\\s*;" // Y值
// "\\s*([-+]?\\d+\\.?\\d*([eE][-+]?\\d+)?)\\s*;" // Z值
// "\\s*$"
// );
// while (!in.atEnd()) {
// QString line = in.readLine().trimmed();
// if(line.isEmpty()) continue;
// QRegularExpressionMatch match = re.match(line);
// if(match.hasMatch()) {
// bool ok;
// float x = match.captured(1).toFloat(&ok);
// if(!ok) continue;
// float y = match.captured(5).toFloat(&ok);
// if(!ok) continue;
// float z = match.captured(3).toFloat(&ok);
// if(!ok) continue;
// // 更新坐标范围
// minX = qMin(minX, x);
// maxX = qMax(maxX, x);
// minY = qMin(minY, y);
// maxY = qMax(maxY, y);
// minZ = qMin(minZ, z);
// maxZ = qMax(maxZ, z);
// dataArray->append(QScatterDataItem(QVector3D(x, y, z)));
// validLines++;
// }
// }
// file.close();
// if(validLines == 0) {
// QMessageBox::warning(this, "Error", QString::fromLocal8Bit("文件格式不正确或没有有效数据"));
// return;
// }
// // 可视化设置(点云大小)
// series->setItemSize(0.05f);
// series->setMesh(QAbstract3DSeries::MeshSphere);
// series->dataProxy()->resetArray(dataArray);
// // series->setBaseColor(QColor(255, 0, 0)); // 设置红色
// // series->setColorStyle(Q3DTheme::ColorStyleUniform); // 统一颜色模式
// // 创建颜色渐变对象
// QLinearGradient gradient;
// gradient.setColorAt(0.0, Qt::blue);
// gradient.setColorAt(0.5, Qt::green);
// gradient.setColorAt(1.0, Qt::red);
// // 应用渐变设置
// series->setBaseGradient(gradient);
// series->setColorStyle(Q3DTheme::ColorStyleRangeGradient); // 使用范围渐变
// series->setMesh(QAbstract3DSeries::MeshPoint); // 使用点状显示更清晰
// // 设置坐标轴范围(带10%边距)
// auto addMargin = [](float min, float max) {
// float range = max - min;
// return range > 0 ? range * 0.01 : 1.0;
// };
// scatter->axisX()->setRange(minX - addMargin(minX, maxX), maxX + addMargin(minX, maxX));
// scatter->axisY()->setRange(minY - addMargin(minY, maxY), maxY + addMargin(minY, maxY));
// scatter->axisZ()->setRange(minZ - addMargin(minZ, maxZ), maxZ + addMargin(minZ, maxZ));
// // 在loadDataFromFile函数中添加(加载数据之后)
// series->setBaseColor(QColor(255, 0, 0)); // 设置为红色
// series->setColorStyle(Q3DTheme::ColorStyleUniform); // 统一颜色模式
// // // 设置坐标轴标签
// // scatter->axisX()->setTitle("X Axis");
// // scatter->axisY()->setTitle("Y Axis");
// // scatter->axisZ()->setTitle("Z Axis");
// // 获取坐标轴对象
// QValue3DAxis *axisX = scatter->axisX();
// QValue3DAxis *axisY = scatter->axisY();
// QValue3DAxis *axisZ = scatter->axisZ();
// // 设置轴名称
// axisX->setTitle("X Axis");
// axisZ->setTitle("Y Axis");
// axisY->setTitle("Z Axis");
// // 设置标题可见性
// axisX->setTitleVisible(true);
// axisY->setTitleVisible(true);
// axisZ->setTitleVisible(true);
// // 设置标签格式(保留两位小数)
// axisX->setLabelFormat("%.2f");
// axisY->setLabelFormat("%.2f");
// axisZ->setLabelFormat("%.2f");
// }
// void addControlButtons(QVBoxLayout *layout, Q3DScatter *scatter) {
// QHBoxLayout *btnLayout = new QHBoxLayout;
// auto createButton = [&](const QString &text, std::function<void()> func) {
// QPushButton *btn = new QPushButton(text);
// connect(btn, &QPushButton::clicked, func);
// btnLayout->addWidget(btn);
// };
// // 添加文件选择按钮
// createButton(QString::fromLocal8Bit("打开文件"), [this] {
// QString filename = QFileDialog::getOpenFileName(this,
// QString::fromLocal8Bit("选择点云文件"),
// QDir::currentPath(),
// "Text files (*.txt)");
// if (!filename.isEmpty()) {
// loadDataFromFile(filename);
// }
// });
// createButton("Zoom In", [scatter] {
// scatter->scene()->activeCamera()->setZoomLevel(
// qMin(scatter->scene()->activeCamera()->zoomLevel() * 1.1f, 500.0f));
// });
// createButton("Zoom Out", [scatter] {
// scatter->scene()->activeCamera()->setZoomLevel(
// qMax(scatter->scene()->activeCamera()->zoomLevel() * 0.9f, 10.0f));
// });
// createButton(QString::fromLocal8Bit("← Rotate"), [scatter] {
// scatter->scene()->activeCamera()->setXRotation(
// scatter->scene()->activeCamera()->xRotation() - 10);
// });
// createButton(QString::fromLocal8Bit("Rotate →"), [scatter] {
// scatter->scene()->activeCamera()->setXRotation(
// scatter->scene()->activeCamera()->xRotation() + 10);
// });
// layout->addLayout(btnLayout);
// }
//};
//int main(int argc, char *argv[]) {
// QApplication app(argc, argv);
// QSurfaceFormat format;
// format.setSamples(8);
// QSurfaceFormat::setDefaultFormat(format);
// SurfaceViewer viewer;
// viewer.resize(1000, 800);
// viewer.setWindowTitle(QString::fromLocal8Bit("3D点云查看器"));
// viewer.show();
// return app.exec();
//}
//#include "main.moc"
#include <QApplication>
#include <QtDataVisualization>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QFile>
#include <QTextStream>
#include <QMessageBox>
#include <QRegularExpression>
#include <QFileDialog>
using namespace QtDataVisualization;
class SurfaceViewer : public QWidget {
Q_OBJECT
public:
explicit SurfaceViewer(QWidget *parent = nullptr) : QWidget(parent) {
// 初始化3D视图
scatter = new Q3DScatter();
container = QWidget::createWindowContainer(scatter);
// 设置布局
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(container, 1);
// 初始化数据系列
proxy = new QScatterDataProxy();
series = new QScatter3DSeries(proxy);
scatter->addSeries(series);
// 添加控制按钮
addControlButtons(layout, scatter);
// 初始样式设置
series->setItemSize(0.05f);
series->setMesh(QAbstract3DSeries::MeshSphere);
QLinearGradient gradient;
gradient.setColorAt(0.0, Qt::blue);
gradient.setColorAt(0.5, Qt::green);
gradient.setColorAt(1.0, Qt::red);
series->setBaseGradient(gradient);
series->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
// 坐标轴设置
scatter->axisX()->setTitle("X Axis");
scatter->axisZ()->setTitle("Y Axis");
scatter->axisY()->setTitle("Z Axis");
scatter->axisX()->setTitleVisible(true);
scatter->axisY()->setTitleVisible(true);
scatter->axisZ()->setTitleVisible(true);
scatter->axisX()->setLabelFormat("%.2f");
scatter->axisY()->setLabelFormat("%.2f");
scatter->axisZ()->setLabelFormat("%.2f");
// 或者自定义主题属性
Q3DTheme *customTheme = new Q3DTheme(Q3DTheme::ThemeStoneMoss);
customTheme->setBackgroundEnabled(false);
customTheme->setLightStrength(0); // 减弱光源强度
}
private:
Q3DScatter *scatter;
QScatter3DSeries *series;
QWidget *container;
QScatterDataProxy *proxy;
void loadDataFromFile(const QString &filename) {
QFile file(filename);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QMessageBox::warning(this, "Error", "无法打开文件");
return;
}
QScatterDataArray *dataArray = new QScatterDataArray;
QTextStream in(&file);
float minX = INFINITY, maxX = -INFINITY;
float minY = INFINITY, maxY = -INFINITY;
float minZ = INFINITY, maxZ = -INFINITY;
int validLines = 0;
const QRegularExpression re(
"^\\s*([-+]?\\d+\\.?\\d*([eE][-+]?\\d+)?)\\s*;" // X值
"\\s*([-+]?\\d+\\.?\\d*([eE][-+]?\\d+)?)\\s*;" // Y值
"\\s*([-+]?\\d+\\.?\\d*([eE][-+]?\\d+)?)\\s*;" // Z值
"\\s*$"
);
while (!in.atEnd()) {
QString line = in.readLine().trimmed();
if(line.isEmpty()) continue;
QRegularExpressionMatch match = re.match(line);
if(match.hasMatch()) {
bool ok;
float x = match.captured(1).toFloat(&ok);
if(!ok) continue;
float y = match.captured(5).toFloat(&ok);
if(!ok) continue;
float z = match.captured(3).toFloat(&ok);
if(!ok) continue;
// 更新坐标范围
minX = qMin(minX, x);
maxX = qMax(maxX, x);
minY = qMin(minY, y);
maxY = qMax(maxY, y);
minZ = qMin(minZ, z);
maxZ = qMax(maxZ, z);
dataArray->append(QScatterDataItem(QVector3D(x, y, z)));
validLines++;
}
}
file.close();
if(validLines == 0) {
QMessageBox::warning(this, "Error", QString::fromLocal8Bit("文件格式不正确或没有有效数据"));
return;
}
// 可视化设置(点云大小)
series->setItemSize(0.05f);
series->setMesh(QAbstract3DSeries::MeshSphere);
series->dataProxy()->resetArray(dataArray);
// series->setBaseColor(QColor(255, 0, 0)); // 设置红色
// series->setColorStyle(Q3DTheme::ColorStyleUniform); // 统一颜色模式
// 创建颜色渐变对象
QLinearGradient gradient;
gradient.setColorAt(0.0, Qt::blue);
gradient.setColorAt(0.5, Qt::green);
gradient.setColorAt(1.0, Qt::red);
// 应用渐变设置
series->setBaseGradient(gradient);
series->setColorStyle(Q3DTheme::ColorStyleRangeGradient); // 使用范围渐变
series->setMesh(QAbstract3DSeries::MeshPoint); // 使用点状显示更清晰
// 设置坐标轴范围(带10%边距)
auto addMargin = [](float min, float max) {
float range = max - min;
return range > 0 ? range * 0.01 : 1.0;
};
scatter->axisX()->setRange(minX - addMargin(minX, maxX), maxX + addMargin(minX, maxX));
scatter->axisY()->setRange(minY - addMargin(minY, maxY), maxY + addMargin(minY, maxY));
scatter->axisZ()->setRange(minZ - addMargin(minZ, maxZ), maxZ + addMargin(minZ, maxZ));
// 在loadDataFromFile函数中添加(加载数据之后)
// series->setBaseColor(QColor(255, 0, 0)); // 设置为红色
// series->setColorStyle(Q3DTheme::ColorStyleUniform); // 统一颜色模式
// // 设置坐标轴标签
// scatter->axisX()->setTitle("X Axis");
// scatter->axisY()->setTitle("Y Axis");
// scatter->axisZ()->setTitle("Z Axis");
// 获取坐标轴对象
QValue3DAxis *axisX = scatter->axisX();
QValue3DAxis *axisY = scatter->axisY();
QValue3DAxis *axisZ = scatter->axisZ();
// 设置轴名称
axisX->setTitle("X Axis");
axisZ->setTitle("Y Axis");
axisY->setTitle("Z Axis");
// 设置标题可见性
axisX->setTitleVisible(true);
axisY->setTitleVisible(true);
axisZ->setTitleVisible(true);
// 设置标签格式(保留两位小数)
axisX->setLabelFormat("%.2f");
axisY->setLabelFormat("%.2f");
axisZ->setLabelFormat("%.2f");
}
void addControlButtons(QVBoxLayout *layout, Q3DScatter *scatter) {
QHBoxLayout *btnLayout = new QHBoxLayout;
auto createButton = [&](const QString &text, std::function<void()> func) {
QPushButton *btn = new QPushButton(text);
connect(btn, &QPushButton::clicked, func);
btnLayout->addWidget(btn);
};
// 添加文件选择按钮
createButton(QString::fromLocal8Bit("打开文件"), [this] {
QString filename = QFileDialog::getOpenFileName(this,
QString::fromLocal8Bit("选择点云文件"),
QDir::currentPath(),
"Text files (*.txt)");
if (!filename.isEmpty()) {
loadDataFromFile(filename);
}
});
createButton("Zoom In", [scatter] {
scatter->scene()->activeCamera()->setZoomLevel(
qMin(scatter->scene()->activeCamera()->zoomLevel() * 1.1f, 500.0f));
});
createButton("Zoom Out", [scatter] {
scatter->scene()->activeCamera()->setZoomLevel(
qMax(scatter->scene()->activeCamera()->zoomLevel() * 0.9f, 10.0f));
});
createButton(QString::fromLocal8Bit("← Rotate"), [scatter] {
scatter->scene()->activeCamera()->setXRotation(
scatter->scene()->activeCamera()->xRotation() - 10);
});
createButton(QString::fromLocal8Bit("Rotate →"), [scatter] {
scatter->scene()->activeCamera()->setXRotation(
scatter->scene()->activeCamera()->xRotation() + 10);
});
layout->addLayout(btnLayout);
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QSurfaceFormat format;
format.setSamples(8);
QSurfaceFormat::setDefaultFormat(format);
SurfaceViewer viewer;
viewer.resize(1000, 800);
viewer.setWindowTitle(QString::fromLocal8Bit("3D点云查看器"));
viewer.show();
return app.exec();
}
#include "main.moc"