// 引入OpenGl_GraphicDriver.hxx头文件。这个头文件通常包含OpenGL图形驱动的相关定义和函数。
#include <OpenGl_GraphicDriver.hxx>
// 引入occView.h头文件,这个头文件可能定义了一个名为'occView'的类或者相关的视图类。
#include "occView.h"
// 引入QMenu、QMouseEvent、QRubberBand和QStyleFactory头文件。这些头文件分别用于创建菜单、处理鼠标事件、创建橡皮筋以及管理样式。
#include <QMenu>
#include <QMouseEvent>
#include <QRubberBand>
#include <QStyleFactory>
// 引入V3d_View.hxx头文件,这个头文件可能定义了一个名为'V3d_View'的类或者相关的视图类,这通常与3D视图相关。
#include <V3d_View.hxx>
// 引入Aspect_Handle.hxx和Aspect_DisplayConnection.hxx头文件。这两个头文件可能定义了与面向对象编程(Aspect-Oriented Programming, AOP)相关的处理和显示连接。
#include <Aspect_Handle.hxx>
#include <Aspect_DisplayConnection.hxx>
// 判断是否为Windows NT(一个操作系统系列)环境,如果是则引入WNT_Window.hxx头文件。
#ifdef WNT
#include <WNT_Window.hxx>
#elif // 如果不是Windows NT环境而是Apple环境(如MacOS),并且没有定义使用GLX(OpenGL X Window系统绑定),则引入Cocoa_Window.hxx头文件。
defined(__APPLE__) && !defined(MACOSX_USE_GLX)
#include <Cocoa_Window.hxx>
#else // 对于其他所有环境(这里主要指Unix和Linux环境),则进行一系列的预处理指令,取消对Bool、CursorShape、None、KeyPress、KeyRelease、FocusIn、FocusOut、FontChange和Expose等符号的定义,然后引入Xw_Window.hxx头文件。
#undef Bool
#undef CursorShape
#undef None
#undef KeyPress
#undef KeyRelease
#undef FocusIn
#undef FocusOut
#undef FontChange
#undef Expose
#include <Xw_Window.hxx>
#endif // 所有的条件判断结束
// 定义一个静态函数 GetGraphicDriver,返回类型为 Handle(Graphic3d_GraphicDriver) 的引用
static Handle(Graphic3d_GraphicDriver)& GetGraphicDriver()
{
// 定义一个静态的 Handle(Graphic3d_GraphicDriver) 类型的对象 aGraphicDriver
static Handle(Graphic3d_GraphicDriver) aGraphicDriver;
// 返回 aGraphicDriver 的引用
return aGraphicDriver;
}
// 定义一个 OccView 类的构造函数,参数为 QWidget* 类型的指针 parent
OccView::OccView(QWidget* parent )
// 调用父类 QWidget 的构造函数,将 parent 作为参数
: QWidget(parent),
// 定义并初始化 myXmin 为 0
myXmin(0),
// 定义并初始化 myYmin 为 0
myYmin(0),
// 定义并初始化 myXmax 为 0
myXmax(0),
// 定义并初始化 myYmax 为 0
myYmax(0),
// 定义并初始化 myCurrentMode 为 CurAction3d_DynamicRotation
myCurrentMode(CurAction3d_DynamicRotation),
// 定义并初始化 myDegenerateModeIsOn 为 Standard_True
myDegenerateModeIsOn(Standard_True),
// 定义并初始化 myRectBand 为 NULL
myRectBand(NULL)
{
// 设置背景角色为 QPalette::NoRole,即无背景
// No Background
setBackgroundRole( QPalette::NoRole );
// 设置焦点策略为 Qt::StrongFocus,以处理来自键盘的 QContextMenuEvent
// set focus policy to threat QContextMenuEvent from keyboard
setFocusPolicy(Qt::StrongFocus);
// 设置窗口属性为 Qt::WA_PaintOnScreen,以在屏幕上绘制窗口
setAttribute(Qt::WA_PaintOnScreen);
// 设置窗口属性为 Qt::WA_NoSystemBackground,以无系统背景
setAttribute(Qt::WA_NoSystemBackground);
// 启用鼠标跟踪,默认情况下鼠标跟踪是禁用的。
// Enable the mouse tracking, by default the mouse tracking is disabled.
setMouseTracking( true );
// 调用 init 函数进行初始化
init();
}
// 定义一个名为 OccView 的类的成员函数 init()
void OccView::init()
{
// 创建一个 Aspect_DisplayConnection 对象,并将其赋值给一个 Handle 类型的变量
// Handle 是从一个名为 Aspect_DisplayConnection 的类创建的智能指针
// 使用 new 关键字在堆上动态分配内存来创建对象
Handle(Aspect_DisplayConnection) aDisplayConnection =
new Aspect_DisplayConnection();
// 检查 GetGraphicDriver() 函数返回的对象是否为空,如果为空,则通过 new 关键字创建一个 OpenGl_GraphicDriver 对象,并将其赋值给 GetGraphicDriver() 返回的对象
// 这里的 GetGraphicDriver() 函数应该返回一个某种类型的智能指针或者对象
// GetGraphicDriver().IsNull() 检查该对象是否为空,如果为空,则执行下面的代码
if (GetGraphicDriver().IsNull())
{
GetGraphicDriver() = new OpenGl_GraphicDriver(aDisplayConnection);
}
// 通过 winId() 函数获取窗口句柄,并将其强制类型转换为 WId 类型,然后赋值给 window_handle 变量
// winId() 可能是一个返回窗口句柄的函数,具体取决于其实现和上下文
WId window_handle = (WId) winId();
// 根据不同的平台创建不同的窗口对象,这里使用了条件编译
// WNT 是 Windows NT 的缩写,用于 Windows 操作系统
// __APPLE__ 是苹果公司的 C++ 预处理器宏,用于 MacOS 和 iOS 等系统
// MACOSX_USE_GLX 是用于在 MacOS 上使用 GLX 的宏,如果未定义此宏,那么就认为我们正在使用 MacOS
#ifdef WNT
Handle(WNT_Window) wind = new WNT_Window((Aspect_Handle) window_handle);
#elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
Handle(Cocoa_Window) wind = new Cocoa_Window((NSView *) window_handle);
#else
Handle(Xw_Window) wind = new Xw_Window(aDisplayConnection, (Window) window_handle);
#endif
// 创建一个 V3d_Viewer 对象,并将其赋值给 myViewer 变量
// V3d_Viewer 的构造函数需要一个 GetGraphicDriver() 返回的对象的引用作为参数
myViewer = new V3d_Viewer(GetGraphicDriver());
// 使用 myViewer 对象的 CreateView() 方法创建一个 V3d_View 对象,并将其赋值给 myView 变量
myView = myViewer->CreateView();
// 将创建的窗口对象设置给 myView 对象的窗口属性,如果窗口未映射,则尝试映射窗口
myView->SetWindow(wind);
if (!wind->IsMapped()) wind->Map();
// 创建一个 AIS_InteractiveContext 对象,并将其赋值给 myContext 变量
// AIS_InteractiveContext 的构造函数应该需要一个 V3d_Viewer 对象的引用作为参数
myContext = new AIS_InteractiveContext(myViewer);
// 设置一些默认的灯光等参数,如开启灯光,设置背景颜色等操作
// SetDefaultLights() 和 SetLightOn() 方法应该是 V3d_Viewer 类的方法
myViewer->SetDefaultLights();
myViewer->SetLightOn();
// 设置背景颜色为黑色,并标记视图需要重新绘制,尝试显示特定的图形元素(这里可能是某种特定的3D模型或视图)
myView->SetBackgroundColor(Quantity_NOC_BLACK);
myView->MustBeResized();
myView->TriedronDisplay(Aspect_TOTP_LEFT_LOWER, Quantity_NOC_GOLD, 0.08, V3d_ZBUFFER);
// 设置显示模式为 Shaded(着色模式),并开启某些可能的特性(这里可能是某种特定的渲染或显示特性)
myContext->SetDisplayMode(AIS_Shaded, Standard_True);
}
// 返回一个类型为 Handle(AIS_InteractiveContext) 的智能指针,引用指向 myContext 成员变量
const Handle(AIS_InteractiveContext)& OccView::getContext() const
{
return myContext;
}
// 声明一个公开的虚函数,返回类型为 QPaintEngine*
/*!
Get paint engine for the OpenGL viewer. [ virtual public ]
*/
QPaintEngine* OccView::paintEngine() const
{
// 返回一个空指针
return 0;
}
// 重写 QWidget 类的 paintEvent 函数,用于绘制视图中的内容。参数 theEvent 为 QPaintEvent* 类型
void OccView::paintEvent( QPaintEvent* /*theEvent*/ )
{
// 调用 myView 的 Redraw 方法,重绘视图内容
myView->Redraw();
}
// 重写 QWidget 类的 resizeEvent 函数,当窗口大小被改变时,该函数会被调用。参数 theEvent 为 QResizeEvent* 类型
void OccView::resizeEvent( QResizeEvent* /*theEvent*/ )
{
// 检查 myView 是否为空,如果不为空
if( !myView.IsNull() )
{
// 调用 myView 的 MustBeResized 方法,可能是通知视图窗口大小已被改变
myView->MustBeResized();
}
}
// 函数 fitAll,将视图中的所有内容完全适应窗口,并重绘视图
void OccView::fitAll( void )
{
// 调用 myView 的 FitAll 方法,可能是缩放视图以适应窗口大小
myView->FitAll();
// 调用 myView 的 ZFitAll 方法,可能是对 z 轴进行缩放以适应窗口大小
myView->ZFitAll();
// 调用 myView 的 Redraw 方法,重绘视图
myView->Redraw();
}
// 函数 reset,重置视图状态,可能是清空或重置当前视图的状态
void OccView::reset( void )
{
// 调用 myView 的 Reset 方法,重置视图状态
myView->Reset();
}
// 定义 OccView 类的成员函数 pan,该函数不接受任何参数,也没有返回值
void OccView::pan( void )
{
// 将 myCurrentMode 成员变量设置为 CurAction3d_DynamicPanning,表示进入动态平移模式
myCurrentMode = CurAction3d_DynamicPanning;
}
// 定义 OccView 类的成员函数 zoom,该函数不接受任何参数,也没有返回值
void OccView::zoom( void )
{
// 将 myCurrentMode 成员变量设置为 CurAction3d_DynamicZooming,表示进入动态缩放模式
myCurrentMode = CurAction3d_DynamicZooming;
}
// 定义 OccView 类的成员函数 rotate,该函数不接受任何参数,也没有返回值
void OccView::rotate( void )
{
// 将 myCurrentMode 成员变量设置为 CurAction3d_DynamicRotation,表示进入动态旋转模式
myCurrentMode = CurAction3d_DynamicRotation;
}
// 定义 OccView 类的成员函数 mousePressEvent,该函数接受一个 QMouseEvent* 类型的参数 theEvent,没有返回值
void OccView::mousePressEvent( QMouseEvent* theEvent )
{
// 检查点击的鼠标按钮是否为左键
if (theEvent->button() == Qt::LeftButton)
{
// 如果是左键,则调用 onLButtonDown 函数,并将 theEvent->buttons() 和 theEvent->modifiers() 的结果作为参数传递,同时传递点击的位置信息 theEvent->pos()
onLButtonDown((theEvent->buttons() | theEvent->modifiers()), theEvent->pos());
}
// 检查点击的鼠标按钮是否为中键
else if (theEvent->button() == Qt::MidButton)
{
// 如果是中键,则调用 onMButtonDown 函数,并将 theEvent->buttons() 和 theEvent->modifiers() 的结果作为参数传递,同时传递点击的位置信息 theEvent->pos()
onMButtonDown((theEvent->buttons() | theEvent->modifiers()), theEvent->pos());
}
// 检查点击的鼠标按钮是否为右键
else if (theEvent->button() == Qt::RightButton)
{
// 如果是右键,则调用 onRButtonDown 函数,并将 theEvent->buttons() 和 theEvent->modifiers() 的结果作为参数传递,同时传递点击的位置信息 theEvent->pos()
onRButtonDown((theEvent->buttons() | theEvent->modifiers()), theEvent->pos());
}
}
// 定义 OccView 类的成员函数 mouseReleaseEvent,该函数接受一个 QMouseEvent* 类型的参数 theEvent,没有返回值
void OccView::mouseReleaseEvent( QMouseEvent* theEvent )
{
// 检查释放的鼠标按钮是否为左键
if (theEvent->button() == Qt::LeftButton)
{
// 如果是左键,则调用 onLButtonUp 函数,并将 theEvent->buttons() 和 theEvent->modifiers() 的结果作为参数传递,同时传递释放的位置信息 theEvent->pos()
onLButtonUp(theEvent->buttons() | theEvent->modifiers(), theEvent->pos());
}
// 检查释放的鼠标按钮是否为中键
else if (theEvent->button() == Qt::MidButton)
{
// 如果是中键,则调用 onMButtonUp 函数,并将 theEvent->buttons() 和 theEvent->modifiers() 的结果作为参数传递,同时传递释放的位置信息 theEvent->pos()
onMButtonUp(theEvent->buttons() | theEvent->modifiers(), theEvent->pos());
}
// 检查释放的鼠标按钮是否为右键
else if (theEvent->button() == Qt::RightButton)
{
// 如果是右键,则调用 onRButtonUp 函数,并将 theEvent->buttons() 和 theEvent->modifiers() 的结果作为参数传递,同时传递释放的位置信息 theEvent->pos()
onRButtonUp(theEvent->buttons() | theEvent->modifiers(), theEvent->pos());
}
}
// 定义 OccView 类的成员函数 mouseMoveEvent,该函数接受一个 QMouseEvent* 类型的参数 theEvent,没有返回值
void OccView::mouseMoveEvent( QMouseEvent * theEvent )
{
// 调用 onMouseMove 函数,并将 theEvent->buttons() 的结果和 theEvent->pos() 的结果作为参数传递
onMouseMove(theEvent->buttons(), theEvent->pos());
}
// 定义 OccView 类的成员函数 wheelEvent,该函数接受一个 QWheelEvent* 类型的参数 theEvent,没有返回值
void OccView::wheelEvent( QWheelEvent * theEvent )
{
// 调用 onMouseWheel 函数,并将 theEvent->buttons(),theEvent->delta() 和 theEvent->pos() 的结果作为参数传递
onMouseWheel(theEvent->buttons(), theEvent->delta(), theEvent->pos());
}
// 定义 OccView 类的成员函数 onLButtonDown,该函数接受两个参数:一个 int 类型的 theFlags 和一个 QPoint 类型的 thePoint,没有返回值
void OccView::onLButtonDown( const int /*theFlags*/, const QPoint thePoint )
{
// 将当前鼠标的 x 坐标保存在 myXmin 中
// Save the current mouse coordinate in min.
myXmin = thePoint.x();
// 将当前鼠标的 y 坐标保存在 myYmin 中
myYmin = thePoint.y();
// 将当前鼠标的 x 坐标保存在 myXmax 中
myXmax = thePoint.x();
// 将当前鼠标的 y 坐标保存在 myYmax 中
myYmax = thePoint.y();
}
// 定义 OccView 类的成员函数 onMButtonDown,该函数接受两个参数:一个 int 类型的 theFlags 和一个 QPoint 类型的 thePoint,没有返回值
void OccView::onMButtonDown( const int /*theFlags*/, const QPoint thePoint )
{
// 将当前鼠标的 x 坐标保存在 myXmin 中
// Save the current mouse coordinate in min.
myXmin = thePoint.x();
// 将当前鼠标的 y 坐标保存在 myYmin 中
myYmin = thePoint.y();
// 将当前鼠标的 x 坐标保存在 myXmax 中
myXmax = thePoint.x();
// 将当前鼠标的 y 坐标保存在 myYmax 中
myYmax = thePoint.y();
// 检查当前模式是否为动态旋转模式
if (myCurrentMode == CurAction3d_DynamicRotation)
{
// 如果是,则开始旋转操作,传入当前鼠标的 x 和 y 坐标
myView->StartRotation(thePoint.x(), thePoint.y());
}
}
// 定义 OccView 类的成员函数 onRButtonDown,该函数接受两个参数:一个 int 类型的 theFlags 和一个 QPoint 类型的 thePoint,没有返回值
void OccView::onRButtonDown( const int /*theFlags*/, const QPoint /*thePoint*/ )
{
// 这里没有实现任何功能,函数体为空
}
// 定义一个名为OccView的类中的一个鼠标滚轮事件处理函数,该函数接受三个参数:theFlags(整数类型,未使用),theDelta(整数类型,表示滚轮滚动的方向和数量),thePoint(QPoint类型,表示鼠标点击的位置)
void OccView::onMouseWheel( const int /*theFlags*/, const int theDelta, const QPoint thePoint )
{
// 定义一个整型变量aFactor,初始值为16,用于控制滚动的步长
Standard_Integer aFactor = 16;
// 从传入的QPoint对象中获取鼠标点击位置的x和y坐标,并分别赋值给aX和aY变量
Standard_Integer aX = thePoint.x();
Standard_Integer aY = thePoint.y();
// 如果滚轮滚动方向为正向(向上或向前)
if (theDelta > 0)
{
// 鼠标点击位置的x和y坐标分别增加aFactor
aX += aFactor;
aY += aFactor;
}
// 如果滚轮滚动方向为负向(向下或向后)
else
{
// 鼠标点击位置的x和y坐标分别减去aFactor
aX -= aFactor;
aY -= aFactor;
}
// 调用myView对象的Zoom方法,对指定位置进行缩放操作。方法四个参数分别为:原始鼠标点击位置的x和y坐标,以及经过滚轮滚动操作后的鼠标点击位置的x和y坐标
myView->Zoom(thePoint.x(), thePoint.y(), aX, aY);
}
// 定义一个名为OccView的类中的添加项目到弹出菜单的处理函数,该函数接受一个参数:theMenu(QMenu类型的指针,未使用)
void OccView::addItemInPopup( QMenu* /*theMenu*/ )
{
// 函数体为空,即不执行任何操作
}
// 定义一个名为OccView的类中的弹出菜单处理函数,该函数接受两个参数:x(整数类型,未使用)和y(整数类型,未使用)
void OccView::popup( const int /*x*/, const int /*y*/ )
{
// 函数体为空,即不执行任何操作
}
// 定义 OccView 类的成员函数 onLButtonUp,该函数接受两个参数:一个 int 类型的 theFlags 和一个 QPoint 类型的 thePoint,没有返回值
void OccView::onLButtonUp( const int theFlags, const QPoint thePoint )
{
// 隐藏 QRubberBand 对象
// Hide the QRubberBand
if (myRectBand)
{
myRectBand->hide();
}
// 如果按下 Ctrl 键进行多选操作
// Ctrl for multi selection.
if (thePoint.x() == myXmin && thePoint.y() == myYmin)
{
// 如果 theFlags 中包含 Qt::ControlModifier(即 Ctrl 键被按下)
if (theFlags & Qt::ControlModifier)
{
// 调用 multiInputEvent 函数,传入当前的鼠标坐标
multiInputEvent(thePoint.x(), thePoint.y());
}
else
{
// 否则,调用 inputEvent 函数,传入当前的鼠标坐标
inputEvent(thePoint.x(), thePoint.y());
}
}
}
// 定义 OccView 类的成员函数 onMButtonUp,该函数接受两个参数:一个 int 类型的 theFlags 和一个 QPoint 类型的 thePoint,没有返回值
void OccView::onMButtonUp( const int /*theFlags*/, const QPoint thePoint )
{
// 如果鼠标坐标与 myXmin 和 myYmin 相等,即鼠标左键按下的位置与当前位置相同
if (thePoint.x() == myXmin && thePoint.y() == myYmin)
{
// 调用 panByMiddleButton 函数,传入当前的鼠标坐标
panByMiddleButton(thePoint);
}
}
// 定义 OccView 类的成员函数 onRButtonUp,该函数接受两个参数:一个 int 类型的 theFlags 和一个 QPoint 类型的 thePoint,没有返回值
void OccView::onRButtonUp( const int /*theFlags*/, const QPoint thePoint )
{
// 调用 popup 函数,传入当前的鼠标坐标
popup(thePoint.x(), thePoint.y());
}
// 定义一个名为OccView的类的成员函数 onMouseMove,该函数接受两个参数:一个 int 类型的 theFlags 和一个 QPoint 类型的 thePoint,没有返回值
void OccView::onMouseMove( const int theFlags, const QPoint thePoint )
{
// 如果鼠标的左键被按下(theFlags & Qt::LeftButton == true)
// Draw the rubber band.
if (theFlags & Qt::LeftButton)
{
// 调用 drawRubberBand 函数,根据起始点 (myXmin, myYmin) 和当前点 (thePoint.x(), thePoint.y()) 进行绘制
drawRubberBand(myXmin, myYmin, thePoint.x(), thePoint.y());
// 调用 dragEvent 函数,传入当前点的 x 和 y 坐标
dragEvent(thePoint.x(), thePoint.y());
}
// 如果按下了 Ctrl 键(theFlags & Qt::ControlModifier == true)
// Ctrl for multi selection.
if (theFlags & Qt::ControlModifier)
{
// 调用 multiMoveEvent 函数,传入当前点的 x 和 y 坐标
multiMoveEvent(thePoint.x(), thePoint.y());
}
else
{
// 否则调用 moveEvent 函数,传入当前点的 x 和 y 坐标
moveEvent(thePoint.x(), thePoint.y());
}
// 如果鼠标的中键被按下(theFlags & Qt::MidButton == true)
// Middle button.
if (theFlags & Qt::MidButton)
{
// 根据当前模式(myCurrentMode)进行不同的操作
switch (myCurrentMode)
{
// 如果当前模式是 CurAction3d_DynamicRotation(可能是3D动态旋转)
case CurAction3d_DynamicRotation:
// 调用 myView 的 Rotation 方法,传入当前点的 x 和 y 坐标
myView->Rotation(thePoint.x(), thePoint.y());
break;
// 如果当前模式是 CurAction3d_DynamicZooming(可能是3D动态缩放)
case CurAction3d_DynamicZooming:
// 调用 myView 的 Zoom 方法,传入起始点的 x 和 y 坐标、当前点的 x 和 y 坐标
myView->Zoom(myXmin, myYmin, thePoint.x(), thePoint.y());
break;
// 如果当前模式是 CurAction3d_DynamicPanning(可能是3D动态平移)
case CurAction3d_DynamicPanning:
// 调用 myView 的 Pan 方法,传入相对移动的 x 和 y 坐标(应为负值)并更新最大值的 x 和 y 坐标为当前点的 x 和 y 坐标
myView->Pan(thePoint.x() - myXmax, myYmax - thePoint.y());
myXmax = thePoint.x();
myYmax = thePoint.y();
break;
// 如果当前模式是其他(默认为default)
default:
// 不进行任何操作(默认为空操作)
break;
}
}
}
// 定义一个名为OccView的类的成员函数dragEvent,该函数接受两个参数:一个 int 类型的 x 和一个 int 类型的 y,没有返回值
void OccView::dragEvent( const int x, const int y )
{
// 在 myContext 对象中执行选择操作。选择起始点为 (myXmin, myYmin),结束点为 (x, y) 的区域。选中的区域为 myView,选中的模式为 Standard_True(可能是某种特定的选中模式,如“添加选中”或“从选中区域中移除”)
myContext->Select(myXmin, myYmin, x, y, myView, Standard_True);
// 发出一个信号,通知应用“选择”已经改变
emit selectionChanged();
}
// 定义一个名为OccView的类的成员函数multiDragEvent,该函数接受两个参数:一个 int 类型的 x 和一个 int 类型的 y,没有返回值
void OccView::multiDragEvent( const int x, const int y )
{
// 在 myContext 对象中执行“移动选择”操作。选择起始点为 (myXmin, myYmin),结束点为 (x, y) 的区域。选中的区域为 myView,选中的模式为 Standard_True(可能是某种特定的选中模式)
myContext->ShiftSelect(myXmin, myYmin, x, y, myView, Standard_True);
// 发出一个信号,通知应用“选择”已经改变
emit selectionChanged();
}
// 定义一个名为OccView的类的成员函数inputEvent,该函数接受两个参数:一个 int 类型的 x 和一个 int 类型的 y,没有返回值
void OccView::inputEvent( const int x, const int y )
{
// 这部分代码使用了 Q_UNUSED 宏,它表示 x 和 y 参数在函数中并未被使用。这通常是为了避免编译器发出未使用参数的警告
Q_UNUSED(x);
Q_UNUSED(y);
// 在 myContext 对象中执行选择操作,无特定的起始点或结束点,整个 myView 区域被选中,选中的模式为 Standard_True
myContext->Select(Standard_True);
// 发出一个信号,通知应用“选择”已经改变
emit selectionChanged();
}
// 定义一个名为OccView的类的成员函数multiInputEvent,该函数接受两个参数:一个 int 类型的 x 和一个 int 类型的 y,没有返回值
void OccView::multiInputEvent( const int x, const int y )
{
// 这部分代码使用了 Q_UNUSED 宏,它表示 x 和 y 参数在函数中并未被使用。这通常是为了避免编译器发出未使用参数的警告
Q_UNUSED(x);
Q_UNUSED(y);
// 在 myContext 对象中执行“移动选择”操作,无特定的起始点或结束点,整个 myView 区域被选中,选中的模式为 Standard_True
myContext->ShiftSelect(Standard_True);
// 发出一个信号,通知应用“选择”已经改变
emit selectionChanged();
}
// 定义一个名为OccView的类的成员函数moveEvent,该函数接受两个参数:一个 int 类型的 x 和一个 int 类型的 y,没有返回值
void OccView::moveEvent( const int x, const int y )
{
// 在 myContext 对象中执行移动操作,移动到给定的坐标 (x, y),选择的区域为 myView,移动的模式为 Standard_True(可能是某种特定的移动模式)
myContext->MoveTo(x, y, myView, Standard_True);
}
// 定义一个名为OccView的类的成员函数multiMoveEvent,该函数接受两个参数:一个 int 类型的 x 和一个 int 类型的 y,没有返回值
void OccView::multiMoveEvent( const int x, const int y )
{
// 这个函数与上面的moveEvent函数功能基本相同,可能在不同的上下文或条件下被调用,同样在 myContext 对象中执行移动操作,移动到给定的坐标 (x, y),选择的区域为 myView,移动的模式为 Standard_True
myContext->MoveTo(x, y, myView, Standard_True);
}
// 定义一个名为OccView的类的成员函数drawRubberBand,该函数接受四个参数:两个 int 类型的 minX 和 minY 和两个 int 类型的 maxX 和 maxY
void OccView::drawRubberBand( const int minX, const int minY, const int maxX, const int maxY )
{
// 声明一个QRect对象aRect,用于存储一个矩形的大小和位置
QRect aRect;
// 使用三元运算符设置aRect的x和y坐标。如果minX小于maxX,则aRect的x坐标为minX,否则为maxX。同样地,如果minY小于maxY,则aRect的y坐标为minY,否则为maxY
(minX < maxX) ? (aRect.setX(minX)) : (aRect.setX(maxX));
(minY < maxY) ? (aRect.setY(minY)) : (aRect.setY(maxY));
// 使用绝对值函数设置aRect的宽度和高度。宽度为maxX和minX的差的绝对值,高度为maxY和minY的差的绝对值
aRect.setWidth(abs(maxX - minX));
aRect.setHeight(abs(maxY - minY));
// 检查myRectBand是否已经存在。如果不存在,就创建一个新的QRubberBand对象myRectBand,设置其类型为矩形,并将其父对象设置为this
if (!myRectBand)
{
myRectBand = new QRubberBand(QRubberBand::Rectangle, this);
// 设置样式很重要。如果设置为Windows样式,只会绘制一个矩形框架;否则会绘制一个实心矩形
myRectBand->setStyle(QStyleFactory::create("windows"));
}
// 设置myRectBand的几何属性为aRect,并显示myRectBand
myRectBand->setGeometry(aRect);
myRectBand->show();
}
// 定义一个名为panByMiddleButton的成员函数,该函数接收一个QPoint类型的参数thePoint,表示鼠标的点击位置,无返回值
void OccView::panByMiddleButton( const QPoint& thePoint )
{
// 定义两个整型变量aCenterX和aCenterY,初始化为0,它们分别表示视图的中心点的x和y坐标
Standard_Integer aCenterX = 0;
Standard_Integer aCenterY = 0;
// 获取当前视图的大小,存储在aSize中
QSize aSize = size();
// 计算视图的中心点坐标,分别赋值给aCenterX和aCenterY
aCenterX = aSize.width() / 2;
aCenterY = aSize.height() / 2;
// 调用myView的Pan函数,参数为鼠标点击位置相对于视图中心点的偏移量。该函数通常用于实现视图的平移操作。
myView->Pan(aCenterX - thePoint.x(), thePoint.y() - aCenterY);
}