occview.cpp注释解析

// 引入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);  
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值