10:点云处理—QT显示点云

发布于:2025-05-24 ⋅ 阅读:(21) ⋅ 点赞:(0)


#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"











网站公告

今日签到

点亮在社区的每一天
去签到