《Qt+PCL》1.3、背景设置、点云渲染设置、大小调节

一、主要流程

1.1 ui界面创建菜单栏部分相关模块
1.2 ui界面转到槽->信号选择
1.3 渲染相关函数创建
1.4 创建并添加槽函数
1.5 添加实现,创建连接
2.1 新建dialog窗口
2.2 UI界面设置
2.3 界面功能函数设置
2.4 槽函数链接
3.1 添加dialog模块,设置ui界面
3.2 “转到槽”创建槽函数链接
3.3 功能函数设置
3.4 槽函数设置

二、使用步骤

1.1 ui界面创建菜单栏部分相关模块

在这里插入图片描述

1.2 ui界面转到槽->信号选择

在这里插入图片描述

1.3 渲染相关函数创建

创建pcl_view_select_color.h和pcl_view_select_color.cpp文件,将头文件添加到勾陈头文件。
pcl_view_select_color.h:

#ifndef PCL_VIEW_SELECT_COLOR_H
#define PCL_VIEW_SELECT_COLOR_H

//#include "qcolor.h"
#include <QWidget>
//构造一个类用于设置背景颜色,该类继承自自 QWidget(UI对象的基类)
class pcl_view_select_color : public QWidget{

    Q_OBJECT;

public:
    pcl_view_select_color();    //
    ~pcl_view_select_color();

    //设置和获取颜色的方法
    void setColor(const QColor &c){
        if(c.isValid()){
            color = c;
        }
    }
    QColor getColor(){
        return color;
    }
private:
    QColor color;
};

#endif // PCL_VIEW_SELECT_COLOR_H

pcl_view_select_color.cpp:

#ifndef PCL_VIEW_SELECT_COLOR_H
#define PCL_VIEW_SELECT_COLOR_H

//#include "qcolor.h"
#include <QWidget>
//构造一个类用于设置背景颜色,该类继承自自 QWidget(UI对象的基类)
class pcl_view_select_color : public QWidget{

    Q_OBJECT;

public:
    pcl_view_select_color();    //
    ~pcl_view_select_color();

    //设置和获取颜色的方法
    void setColor(const QColor &c){
        if(c.isValid()){
            color = c;
        }
    }
    QColor getColor(){
        return color;
    }
private:
    QColor color;
};

#endif // PCL_VIEW_SELECT_COLOR_H

1.4 创建并添加槽函数

mainwindow.h添加槽函数:

private:
   pcl_view_select_color *dialog_colorselect;

1.5 添加实现,创建连接

mainwindow.cpp文件添加实现:

void MainWindow::on_actionBackGroundColor_triggered()
{
    dialog_colorselect = new pcl_view_select_color();  //创建颜色选择对话框,用于选择颜色
    QColor color = dialog_colorselect->getColor();     //获取颜色
    viewer->setBackgroundColor(color.redF(), color.greenF(), color.blueF());//设置背景颜色
    return;
}

注:注意!注意!注意!
采用“转到槽”的方式自动创建连接,不用手动输入下述代码,若输入下述代码则会发生渲染界面弹出两次的问题:

 connect(ui->actionBackGroundColor, SIGNAL(triggered()), this, SLOT(on_actionBackGroundColor_triggered()));

2.1 新建dialog窗口

在这里插入图片描述在这里插入图片描述

2.2 UI界面设置

在这里插入图片描述
在这里插入图片描述
分别右键转到槽,自动生成相关的.h和.cpp文件:
在这里插入图片描述
在主界面
在这里插入图片描述在这里插入图片描述

2.3 界面功能函数设置

cloudrendering.h和cloudrendering.cpp文件添加下述内容:
cloudrendering.h

#ifndef CLOUDRENDERING_H
#define CLOUDRENDERING_H

#include <QDialog>

namespace Ui {
class CloudRendering;
}

class CloudRendering : public QDialog
{
    Q_OBJECT

public:
    explicit CloudRendering(QWidget *parent = nullptr);
    ~CloudRendering();

signals:
    void sendData(QString data);

private slots:
    void on_radioButton_clicked();

    void on_radioButton_2_clicked();

    void on_radioButton_3_clicked();

    void on_buttonBox_accepted();

private:
    Ui::CloudRendering *ui;
    QString axis;
};

#endif // CLOUDRENDERING_H

cloudrendering.cpp:

#include "cloudrendering.h"
#include "ui_cloudrendering.h"

CloudRendering::CloudRendering(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::CloudRendering)
{
    ui->setupUi(this);
}

CloudRendering::~CloudRendering()
{
    delete ui;
}

void CloudRendering::on_radioButton_clicked()
{
    if(ui->radioButton->isChecked()){
        ui->radioButton_2->setChecked(false);
        ui->radioButton_3->setChecked(false);
        axis = "x";
    }
}

void CloudRendering::on_radioButton_2_clicked()
{
    if(ui->radioButton_2->isChecked()){
        ui->radioButton->setChecked(false);
        ui->radioButton_3->setChecked(false);
        axis = "y";
    }
}

void CloudRendering::on_radioButton_3_clicked()
{
    if(ui->radioButton_3->isChecked()){
        ui->radioButton_2->setChecked(false);
        ui->radioButton->setChecked(false);
        axis = "z";
    }
}

void CloudRendering::on_buttonBox_accepted()
{
    emit sendData(axis);
    this->close();
}

2.4 槽函数链接

mianwindow.h添加:

#include <cloudrendering.h>
private slots:
//渲染
    void on_actionCloudRendering_triggered();
    void Rendering_setting(QString data);
private:
    CloudRendering *dialog_render;

mainwindow.cpp添加:

//点的渲染
void MainWindow::on_actionCloudRendering_triggered()
{
    dialog_render = new CloudRendering();
    qDebug() << "Cloud size: " << cloud.size();//@@@@
    connect(dialog_render, SIGNAL(sendData(QString)), this,SLOT(Rendering_setting(QString)));
    if(dialog_render->exec() == QDialog::Accepted){
        ui->openGLWidget->update();//更新点云数据
        qDebug() << "Cloud updataed.";
    }else{
    }
    delete dialog_render;
}
void MainWindow::Rendering_setting(QString data){
    if(!cloud.empty()){
        qDebug() << "Rendering with field: " << data;//@@@@@@
        pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZRGB>colorHandler(cloud.makeShared(), data.toStdString());
        qDebug() << "Rendering completed.";
        viewer->updatePointCloud(cloud.makeShared(), colorHandler, cloud_name[0]);
        viewer->spinOnce(); // 确保渲染器更新
        qDebug() << "Rendering update.";
    }else{
        qDebug() << "Cloud is empty.";
    }
    return;
}

3.1 添加dialog模块,设置ui界面

在这里插入图片描述

3.2 “转到槽”创建槽函数链接

spinBox控件右键“转到槽”,选择信号valueChanged;
horizontalSlider控件右键“转到槽”,选择信号valueChanged;

3.3 功能函数设置

sizereser.h函数:

#ifndef SIZERESET_H
#define SIZERESET_H

#include <QDialog>

namespace Ui {
class SizeReset;
}

class SizeReset : public QDialog
{
    Q_OBJECT

signals:
    void sendData(QString data);

public:
    explicit SizeReset(QWidget *parent = nullptr);
    ~SizeReset();

private slots:
    void on_spinBox_valueChanged(int arg1);

    void on_horizontalSlider_valueChanged(int value);

    void on_buttonBox_accepted();

private:
    Ui::SizeReset *ui;
};

#endif // SIZERESET_H

sizereser.cpp函数:

#include "sizereset.h"
#include "ui_sizereset.h"

SizeReset::SizeReset(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::SizeReset)
{
    ui->setupUi(this);

    ui->spinBox->setMinimum(0);
    ui->spinBox->setMaximum(10);
    ui->spinBox->setSingleStep(1);
    ui->spinBox->setValue(5);

    ui->horizontalSlider->setMinimum(0);
    ui->horizontalSlider->setMaximum(10);
    ui->horizontalSlider->setSingleStep(1);
    ui->horizontalSlider->setValue(5);

}

SizeReset::~SizeReset()
{
    delete ui;
}

void SizeReset::on_spinBox_valueChanged(int arg1)
{
    //connect(ui->spinBox, SIGNAL(valueChanged(int)), ui->horizontalSlider, SLOT(setValue(arg1)));
    ui->horizontalSlider->setValue(arg1);
}

void SizeReset::on_horizontalSlider_valueChanged(int value)
{
    //connect(ui->horizontalSlider);
     ui->spinBox->setValue(value);
}

void SizeReset::on_buttonBox_accepted()
{
    QString value = QString("%1").arg(ui->horizontalSlider->value());
    emit sendData(value);
    this->close();
}

3.4 槽函数设置

mainWindow.h添加下述内容:

private slots:
   //点尺寸
    void on_actionCloudSizeReset_triggered();
    void Size_reset(QString data);

private:
    SizeReset *dialog_slider;

mainWindow.cpp添加下述内容:

void MainWindow::on_actionCloudSizeReset_triggered()
{
    dialog_slider = new SizeReset();
    connect(dialog_slider, SIGNAL(sendData(QString)), this, SLOT(Size_reset(QString)));
    if(dialog_slider->exec() == QDialog::Accepted)
        delete dialog_slider;
}
void MainWindow::Size_reset(QString data){
    point_size = data.toInt();

    for(int i=0; i<cloud_name.size(); i++){
        viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, point_size, cloud_name[i]);
    }
    return;
}

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

钟某某人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值