文章目录
一、主要流程
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;
}