将视图控制封装到CloudView3D中
This commit is contained in:
parent
176a833bb2
commit
3156f82339
@ -146,11 +146,6 @@ private slots:
|
|||||||
*/
|
*/
|
||||||
void onPoint2CoordChanged();
|
void onPoint2CoordChanged();
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 处理视角旋转角度改变事件
|
|
||||||
*/
|
|
||||||
void onViewAnglesChanged(float rotX, float rotY, float rotZ);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 通过输入线号选择线
|
* @brief 通过输入线号选择线
|
||||||
*/
|
*/
|
||||||
@ -243,11 +238,6 @@ private:
|
|||||||
*/
|
*/
|
||||||
QGroupBox* createFileGroup();
|
QGroupBox* createFileGroup();
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 创建视图方向工具栏(纵向排列,位于3D视图左侧)
|
|
||||||
*/
|
|
||||||
QWidget* createViewToolbar();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 创建选点测距组
|
* @brief 创建选点测距组
|
||||||
*/
|
*/
|
||||||
@ -328,11 +318,6 @@ private:
|
|||||||
QPushButton* m_btnOpenBBox;
|
QPushButton* m_btnOpenBBox;
|
||||||
QPushButton* m_btnClearAll;
|
QPushButton* m_btnClearAll;
|
||||||
|
|
||||||
// 视图角度输入控件
|
|
||||||
QLineEdit* m_editRotX;
|
|
||||||
QLineEdit* m_editRotY;
|
|
||||||
QLineEdit* m_editRotZ;
|
|
||||||
|
|
||||||
// 选点测距控件
|
// 选点测距控件
|
||||||
QCheckBox* m_cbMeasureDistance;
|
QCheckBox* m_cbMeasureDistance;
|
||||||
QPushButton* m_btnClearPoints;
|
QPushButton* m_btnClearPoints;
|
||||||
@ -407,10 +392,6 @@ private:
|
|||||||
QTableWidget* m_linePointsTable;
|
QTableWidget* m_linePointsTable;
|
||||||
QVector<QVector3D> m_currentLinePoints; // 当前线的原始点坐标
|
QVector<QVector3D> m_currentLinePoints; // 当前线的原始点坐标
|
||||||
|
|
||||||
// 悬浮缩放按钮
|
|
||||||
QToolButton* m_btnZoomIn;
|
|
||||||
QToolButton* m_btnZoomOut;
|
|
||||||
|
|
||||||
// 启动参数序列显示
|
// 启动参数序列显示
|
||||||
QVector<StartupItem> m_startupSequence;
|
QVector<StartupItem> m_startupSequence;
|
||||||
int m_startupSequenceIndex;
|
int m_startupSequenceIndex;
|
||||||
|
|||||||
@ -1115,19 +1115,7 @@ void CloudViewMainWindow::fitViewToContent()
|
|||||||
|
|
||||||
bool CloudViewMainWindow::eventFilter(QObject* obj, QEvent* event)
|
bool CloudViewMainWindow::eventFilter(QObject* obj, QEvent* event)
|
||||||
{
|
{
|
||||||
if (obj == m_glWidget && event->type() == QEvent::Resize) {
|
// 缩放按钮已移至 CloudView3D,事件过滤器不再需要处理缩放按钮定位
|
||||||
auto* resizeEvt = static_cast<QResizeEvent*>(event);
|
|
||||||
int w = resizeEvt->size().width();
|
|
||||||
int h = resizeEvt->size().height();
|
|
||||||
int btnW = m_btnZoomIn->width();
|
|
||||||
int btnH = m_btnZoomIn->height();
|
|
||||||
int margin = 8;
|
|
||||||
int gap = 4;
|
|
||||||
int x = w - btnW - margin;
|
|
||||||
int y = (h - btnH * 2 - gap) / 2;
|
|
||||||
m_btnZoomIn->move(x, y);
|
|
||||||
m_btnZoomOut->move(x, y + btnH + gap);
|
|
||||||
}
|
|
||||||
return QMainWindow::eventFilter(obj, event);
|
return QMainWindow::eventFilter(obj, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1206,16 +1194,12 @@ void CloudViewMainWindow::setupUI()
|
|||||||
// 创建分割器
|
// 创建分割器
|
||||||
QSplitter* splitter = new QSplitter(Qt::Horizontal, centralWidget);
|
QSplitter* splitter = new QSplitter(Qt::Horizontal, centralWidget);
|
||||||
|
|
||||||
// 左侧:视图工具栏 + 点云显示区域
|
// 左侧:点云显示区域(视图工具栏已移至 CloudView3D)
|
||||||
QWidget* viewerContainer = new QWidget(splitter);
|
QWidget* viewerContainer = new QWidget(splitter);
|
||||||
QHBoxLayout* viewerLayout = new QHBoxLayout(viewerContainer);
|
QHBoxLayout* viewerLayout = new QHBoxLayout(viewerContainer);
|
||||||
viewerLayout->setContentsMargins(0, 0, 0, 0);
|
viewerLayout->setContentsMargins(0, 0, 0, 0);
|
||||||
viewerLayout->setSpacing(2);
|
viewerLayout->setSpacing(2);
|
||||||
|
|
||||||
// 视图方向工具栏(纵向排列,在3D视图左侧)
|
|
||||||
QWidget* viewToolbar = createViewToolbar();
|
|
||||||
viewerLayout->addWidget(viewToolbar);
|
|
||||||
|
|
||||||
// 点云显示区域
|
// 点云显示区域
|
||||||
QWidget* viewerArea = createViewerArea();
|
QWidget* viewerArea = createViewerArea();
|
||||||
viewerLayout->addWidget(viewerArea);
|
viewerLayout->addWidget(viewerArea);
|
||||||
@ -1246,50 +1230,12 @@ QWidget* CloudViewMainWindow::createViewerArea()
|
|||||||
m_glWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
m_glWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||||
layout->addWidget(m_glWidget);
|
layout->addWidget(m_glWidget);
|
||||||
|
|
||||||
// 悬浮缩放按钮(父控件为 m_glWidget,悬浮在右侧中间)
|
// 缩放按钮 / 旋转角度显示已移至 CloudView3D,此处不再创建
|
||||||
int zoomBtnSize = 28;
|
|
||||||
QString zoomBtnStyle =
|
|
||||||
"QToolButton {"
|
|
||||||
" background-color: rgba(50, 50, 50, 180);"
|
|
||||||
" color: white;"
|
|
||||||
" border: 1px solid rgba(120, 120, 120, 150);"
|
|
||||||
" border-radius: 4px;"
|
|
||||||
" font-size: 32px;"
|
|
||||||
" font-weight: bold;"
|
|
||||||
"}"
|
|
||||||
"QToolButton:hover {"
|
|
||||||
" background-color: rgba(80, 80, 80, 220);"
|
|
||||||
"}"
|
|
||||||
"QToolButton:pressed {"
|
|
||||||
" background-color: rgba(30, 30, 30, 240);"
|
|
||||||
"}";
|
|
||||||
|
|
||||||
m_btnZoomIn = new QToolButton(m_glWidget);
|
|
||||||
m_btnZoomIn->setText("+");
|
|
||||||
m_btnZoomIn->setFixedSize(zoomBtnSize, zoomBtnSize);
|
|
||||||
m_btnZoomIn->setStyleSheet(zoomBtnStyle);
|
|
||||||
m_btnZoomIn->setAutoRepeat(true);
|
|
||||||
m_btnZoomIn->setAutoRepeatDelay(300);
|
|
||||||
m_btnZoomIn->setAutoRepeatInterval(50);
|
|
||||||
connect(m_btnZoomIn, &QToolButton::clicked, m_glWidget, &PointCloudGLWidget::zoomIn);
|
|
||||||
|
|
||||||
m_btnZoomOut = new QToolButton(m_glWidget);
|
|
||||||
m_btnZoomOut->setText("-");
|
|
||||||
m_btnZoomOut->setFixedSize(zoomBtnSize, zoomBtnSize);
|
|
||||||
m_btnZoomOut->setStyleSheet(zoomBtnStyle);
|
|
||||||
m_btnZoomOut->setAutoRepeat(true);
|
|
||||||
m_btnZoomOut->setAutoRepeatDelay(300);
|
|
||||||
m_btnZoomOut->setAutoRepeatInterval(50);
|
|
||||||
connect(m_btnZoomOut, &QToolButton::clicked, m_glWidget, &PointCloudGLWidget::zoomOut);
|
|
||||||
|
|
||||||
// 安装事件过滤器,在 GL 控件 resize 时更新按钮位置
|
|
||||||
m_glWidget->installEventFilter(this);
|
|
||||||
|
|
||||||
// 连接信号
|
// 连接信号
|
||||||
connect(m_glWidget, &PointCloudGLWidget::pointSelected, this, &CloudViewMainWindow::onPointSelected);
|
connect(m_glWidget, &PointCloudGLWidget::pointSelected, this, &CloudViewMainWindow::onPointSelected);
|
||||||
connect(m_glWidget, &PointCloudGLWidget::twoPointsSelected, this, &CloudViewMainWindow::onTwoPointsSelected);
|
connect(m_glWidget, &PointCloudGLWidget::twoPointsSelected, this, &CloudViewMainWindow::onTwoPointsSelected);
|
||||||
connect(m_glWidget, &PointCloudGLWidget::lineSelected, this, &CloudViewMainWindow::onLineSelected);
|
connect(m_glWidget, &PointCloudGLWidget::lineSelected, this, &CloudViewMainWindow::onLineSelected);
|
||||||
connect(m_glWidget, &PointCloudGLWidget::viewAnglesChanged, this, &CloudViewMainWindow::onViewAnglesChanged);
|
|
||||||
|
|
||||||
return widget;
|
return widget;
|
||||||
}
|
}
|
||||||
@ -1349,111 +1295,6 @@ QGroupBox* CloudViewMainWindow::createFileGroup()
|
|||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
|
|
||||||
QWidget* CloudViewMainWindow::createViewToolbar()
|
|
||||||
{
|
|
||||||
QWidget* widget = new QWidget(this);
|
|
||||||
QVBoxLayout* layout = new QVBoxLayout(widget);
|
|
||||||
layout->setContentsMargins(2, 2, 2, 2);
|
|
||||||
layout->setSpacing(3);
|
|
||||||
|
|
||||||
// 视图预设:图标、提示、旋转角度
|
|
||||||
struct ViewPreset {
|
|
||||||
const char* iconPath;
|
|
||||||
const char* fallbackText;
|
|
||||||
const char* tooltip;
|
|
||||||
float rotX;
|
|
||||||
float rotY;
|
|
||||||
float rotZ;
|
|
||||||
};
|
|
||||||
|
|
||||||
// 坐标系定义:X向右,Y向下,Z朝后
|
|
||||||
ViewPreset presets[] = {
|
|
||||||
{":/common/resource/view_front.png", "前", "正视 (XY面)", 180.0f, 0.0f, 0.0f},
|
|
||||||
{":/common/resource/view_back.png", "后", "后视", 180.0f, 180.0f, 0.0f},
|
|
||||||
{":/common/resource/view_left.png", "左", "左视 (YZ面)", 180.0f, 90.0f, 0.0f},
|
|
||||||
{":/common/resource/view_right.png", "右", "右视", 180.0f, -90.0f, 0.0f},
|
|
||||||
{":/common/resource/view_top.png", "上", "俯视 (XZ面)", 90.0f, 0.0f, 0.0f},
|
|
||||||
{":/common/resource/view_bottom.png", "下", "仰视", -90.0f, 0.0f, 0.0f},
|
|
||||||
{":/common/resource/view_robot.png", "机", "机械臂", -90.0f, 90.0f, 0.0f},
|
|
||||||
};
|
|
||||||
|
|
||||||
int btnSize = 32;
|
|
||||||
int iconSize = 24;
|
|
||||||
|
|
||||||
for (const auto& preset : presets) {
|
|
||||||
QToolButton* btn = new QToolButton(widget);
|
|
||||||
const QIcon icon(preset.iconPath);
|
|
||||||
if (icon.isNull()) {
|
|
||||||
btn->setText(QString::fromUtf8(preset.fallbackText));
|
|
||||||
} else {
|
|
||||||
btn->setIcon(icon);
|
|
||||||
btn->setIconSize(QSize(iconSize, iconSize));
|
|
||||||
}
|
|
||||||
btn->setFixedSize(btnSize, btnSize);
|
|
||||||
btn->setToolTip(preset.tooltip);
|
|
||||||
btn->setAutoRaise(true);
|
|
||||||
|
|
||||||
float rx = preset.rotX;
|
|
||||||
float ry = preset.rotY;
|
|
||||||
float rz = preset.rotZ;
|
|
||||||
connect(btn, &QToolButton::clicked, this, [this, rx, ry, rz]() {
|
|
||||||
m_glWidget->setViewAngles(rx, ry, rz);
|
|
||||||
m_editRotX->setText(QString::number(rx, 'f', 1));
|
|
||||||
m_editRotY->setText(QString::number(ry, 'f', 1));
|
|
||||||
m_editRotZ->setText(QString::number(rz, 'f', 1));
|
|
||||||
});
|
|
||||||
layout->addWidget(btn);
|
|
||||||
}
|
|
||||||
|
|
||||||
layout->addStretch();
|
|
||||||
|
|
||||||
// 旋转角度输入(纵向紧凑布局)
|
|
||||||
m_editRotX = new QLineEdit("180.0", widget);
|
|
||||||
m_editRotY = new QLineEdit("0.0", widget);
|
|
||||||
m_editRotZ = new QLineEdit("0.0", widget);
|
|
||||||
|
|
||||||
auto makeAngleRow = [&](const QString& label, QLineEdit* edit) {
|
|
||||||
QWidget* row = new QWidget(widget);
|
|
||||||
QVBoxLayout* rowLayout = new QVBoxLayout(row);
|
|
||||||
rowLayout->setContentsMargins(0, 0, 0, 0);
|
|
||||||
rowLayout->setSpacing(0);
|
|
||||||
QLabel* lbl = new QLabel(label, row);
|
|
||||||
lbl->setStyleSheet("font-size: 10px; color: gray;");
|
|
||||||
rowLayout->addWidget(lbl);
|
|
||||||
edit->setFixedWidth(btnSize);
|
|
||||||
edit->setMaximumHeight(20);
|
|
||||||
edit->setStyleSheet("font-size: 10px;");
|
|
||||||
rowLayout->addWidget(edit);
|
|
||||||
return row;
|
|
||||||
};
|
|
||||||
|
|
||||||
layout->addWidget(makeAngleRow("RX", m_editRotX));
|
|
||||||
layout->addWidget(makeAngleRow("RY", m_editRotY));
|
|
||||||
layout->addWidget(makeAngleRow("RZ", m_editRotZ));
|
|
||||||
|
|
||||||
// 应用按钮
|
|
||||||
QPushButton* btnApply = new QPushButton("GO", widget);
|
|
||||||
btnApply->setFixedSize(btnSize, 20);
|
|
||||||
btnApply->setStyleSheet("font-size: 10px;");
|
|
||||||
auto applyAngles = [this]() {
|
|
||||||
bool okX, okY, okZ;
|
|
||||||
float rotX = m_editRotX->text().toFloat(&okX);
|
|
||||||
float rotY = m_editRotY->text().toFloat(&okY);
|
|
||||||
float rotZ = m_editRotZ->text().toFloat(&okZ);
|
|
||||||
if (okX && okY && okZ) {
|
|
||||||
m_glWidget->setViewAngles(rotX, rotY, rotZ);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
connect(btnApply, &QPushButton::clicked, this, applyAngles);
|
|
||||||
connect(m_editRotX, &QLineEdit::returnPressed, this, applyAngles);
|
|
||||||
connect(m_editRotY, &QLineEdit::returnPressed, this, applyAngles);
|
|
||||||
connect(m_editRotZ, &QLineEdit::returnPressed, this, applyAngles);
|
|
||||||
layout->addWidget(btnApply);
|
|
||||||
|
|
||||||
widget->setFixedWidth(btnSize + 8);
|
|
||||||
return widget;
|
|
||||||
}
|
|
||||||
|
|
||||||
QWidget* CloudViewMainWindow::createMeasurePage()
|
QWidget* CloudViewMainWindow::createMeasurePage()
|
||||||
{
|
{
|
||||||
QWidget* page = new QWidget(this);
|
QWidget* page = new QWidget(this);
|
||||||
@ -4599,14 +4440,6 @@ void CloudViewMainWindow::onEulerOrderChanged(int index)
|
|||||||
LOG_INFO("[CloudView] Euler rotation order changed to: %s\n", orderName.toStdString().c_str());
|
LOG_INFO("[CloudView] Euler rotation order changed to: %s\n", orderName.toStdString().c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CloudViewMainWindow::onViewAnglesChanged(float rotX, float rotY, float rotZ)
|
|
||||||
{
|
|
||||||
// 更新显示的角度值
|
|
||||||
m_editRotX->setText(QString::number(rotX, 'f', 1));
|
|
||||||
m_editRotY->setText(QString::number(rotY, 'f', 1));
|
|
||||||
m_editRotZ->setText(QString::number(rotZ, 'f', 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
void CloudViewMainWindow::onPoint1CoordChanged()
|
void CloudViewMainWindow::onPoint1CoordChanged()
|
||||||
{
|
{
|
||||||
// 读取编辑框中的坐标
|
// 读取编辑框中的坐标
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
#include <QOpenGLWidget>
|
#include <QOpenGLWidget>
|
||||||
#include <QOpenGLFunctions>
|
#include <QOpenGLFunctions>
|
||||||
#include <QOpenGLBuffer>
|
#include <QOpenGLBuffer>
|
||||||
|
#include <QOpenGLShaderProgram>
|
||||||
#include <QMatrix4x4>
|
#include <QMatrix4x4>
|
||||||
#include <QVector3D>
|
#include <QVector3D>
|
||||||
#include <QQuaternion>
|
#include <QQuaternion>
|
||||||
@ -14,6 +15,11 @@
|
|||||||
#include "CloudView3DTypes.h"
|
#include "CloudView3DTypes.h"
|
||||||
#include "VZNL_Types.h"
|
#include "VZNL_Types.h"
|
||||||
|
|
||||||
|
class QToolButton;
|
||||||
|
class QPushButton;
|
||||||
|
class QPinchGesture;
|
||||||
|
class QResizeEvent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 点云显示颜色枚举
|
* @brief 点云显示颜色枚举
|
||||||
*/
|
*/
|
||||||
@ -352,6 +358,7 @@ signals:
|
|||||||
void viewAnglesChanged(float rotX, float rotY, float rotZ);
|
void viewAnglesChanged(float rotX, float rotY, float rotZ);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
bool event(QEvent* event) override;
|
||||||
void initializeGL() override;
|
void initializeGL() override;
|
||||||
void resizeGL(int w, int h) override;
|
void resizeGL(int w, int h) override;
|
||||||
void paintGL() override;
|
void paintGL() override;
|
||||||
@ -361,6 +368,7 @@ protected:
|
|||||||
void wheelEvent(QWheelEvent* event) override;
|
void wheelEvent(QWheelEvent* event) override;
|
||||||
void mouseDoubleClickEvent(QMouseEvent* event) override;
|
void mouseDoubleClickEvent(QMouseEvent* event) override;
|
||||||
void keyPressEvent(QKeyEvent* event) override;
|
void keyPressEvent(QKeyEvent* event) override;
|
||||||
|
void resizeEvent(QResizeEvent* event) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct PointCloudData
|
struct PointCloudData
|
||||||
@ -457,9 +465,9 @@ private:
|
|||||||
|
|
||||||
void computeBoundingBox();
|
void computeBoundingBox();
|
||||||
void updateProjection(const QMatrix4x4& modelView);
|
void updateProjection(const QMatrix4x4& modelView);
|
||||||
|
float fittedCameraDistance(float padding = 1.05f) const;
|
||||||
float minimumCameraDistance() const;
|
float minimumCameraDistance() const;
|
||||||
void setCurrentColor(PointCloudColor color);
|
QVector3D colorForIndex(int colorIndex) const;
|
||||||
void setColorByIndex(int colorIndex); // 根据索引设置颜色
|
|
||||||
SelectedPointInfo pickPoint(int screenX, int screenY);
|
SelectedPointInfo pickPoint(int screenX, int screenY);
|
||||||
void drawSelectedPoints();
|
void drawSelectedPoints();
|
||||||
void drawMeasurementLine();
|
void drawMeasurementLine();
|
||||||
@ -475,13 +483,48 @@ private:
|
|||||||
void uploadToVBO(PointCloudData& data); // 上传数据到 VBO
|
void uploadToVBO(PointCloudData& data); // 上传数据到 VBO
|
||||||
void releaseVBO(PointCloudData& data); // 释放 VBO 资源
|
void releaseVBO(PointCloudData& data); // 释放 VBO 资源
|
||||||
|
|
||||||
|
// GLES2 shader 渲染
|
||||||
|
bool ensureShader();
|
||||||
|
void drawCloud(PointCloudData& data, float pointSize);
|
||||||
|
void drawPrimitives(const QMatrix4x4& mvp,
|
||||||
|
const float* positions,
|
||||||
|
int vertexCount,
|
||||||
|
GLenum mode,
|
||||||
|
const float* colors,
|
||||||
|
const QVector3D& uniformColor,
|
||||||
|
float pointSize,
|
||||||
|
float alpha,
|
||||||
|
bool depthTest);
|
||||||
|
void resetRenderState();
|
||||||
|
|
||||||
|
// 覆盖控件:左侧竖向视图按钮 / 左下角旋转角度 / 右侧缩放
|
||||||
|
void createOverlayControls();
|
||||||
|
void repositionOverlayControls();
|
||||||
|
void showViewAngleDialog();
|
||||||
|
void updateViewAngleDisplay();
|
||||||
|
bool handlePinchGesture(QPinchGesture* gesture);
|
||||||
|
|
||||||
std::vector<PointCloudData> m_pointClouds;
|
std::vector<PointCloudData> m_pointClouds;
|
||||||
|
|
||||||
QMatrix4x4 m_projection;
|
QMatrix4x4 m_projection;
|
||||||
QMatrix4x4 m_view;
|
QMatrix4x4 m_view;
|
||||||
QMatrix4x4 m_model;
|
QMatrix4x4 m_model;
|
||||||
|
QMatrix4x4 m_mvp; // 当前帧的模型视图投影矩阵(点云主渲染用)
|
||||||
|
|
||||||
|
// GLES2 shader 渲染资源
|
||||||
|
QOpenGLShaderProgram* m_shader;
|
||||||
|
QOpenGLBuffer m_dynamicVbo; // 动态叠加图元(选中点/线/轴/姿态等)的临时 VBO
|
||||||
|
bool m_shaderReady;
|
||||||
|
GLint m_mvpLocation;
|
||||||
|
GLint m_positionLocation;
|
||||||
|
GLint m_colorLocation;
|
||||||
|
GLint m_pointSizeLocation;
|
||||||
|
GLint m_alphaLocation;
|
||||||
|
GLint m_useVertexColorLocation;
|
||||||
|
GLint m_uniformColorLocation;
|
||||||
|
|
||||||
float m_distance;
|
float m_distance;
|
||||||
|
float m_pinchStartDistance;
|
||||||
float m_rotationX;
|
float m_rotationX;
|
||||||
float m_rotationY;
|
float m_rotationY;
|
||||||
float m_rotationZ;
|
float m_rotationZ;
|
||||||
@ -519,6 +562,13 @@ private:
|
|||||||
QVector<SurfaceQuad> m_basicShapeSurfaces;
|
QVector<SurfaceQuad> m_basicShapeSurfaces;
|
||||||
QVector<BasicShapePoint> m_basicShapePoints;
|
QVector<BasicShapePoint> m_basicShapePoints;
|
||||||
QVector<PosePoint> m_posePoints;
|
QVector<PosePoint> m_posePoints;
|
||||||
|
|
||||||
|
// 覆盖控件
|
||||||
|
QWidget* m_viewToolbar; // 左侧竖向视图按钮容器
|
||||||
|
QVector<QToolButton*> m_viewButtons;
|
||||||
|
QPushButton* m_viewAngleButton; // 左下角旋转角度显示按钮
|
||||||
|
QToolButton* m_zoomInButton;
|
||||||
|
QToolButton* m_zoomOutButton;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // POINT_CLOUD_GL_WIDGET_H
|
#endif // POINT_CLOUD_GL_WIDGET_H
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user