Ogitor探索之代码分析(1)---OgreWidget::mouseMoveEvent;OgitorsRoot::OnMouseMove

    技术2025-10-11  9

    在../qtOgitor/src/ogrewidget.cpp中定义的void OgreWidget::mouseMoveEvent(QMouseEvent *evt)代码如下:

     

    1: void OgreWidget::mouseMoveEvent(QMouseEvent *evt) 2: { 3: if(!OgitorsRoot::getSingletonPtr()->IsSceneLoaded()) 4: return; 5:  6: if(!hasFocus()) 7: setFocus(); 8:  9: Ogre::Vector2 pos(evt->x(), evt->y()); 10:  11: OgitorsRoot::getSingletonPtr()->OnMouseMove(pos, getMouseButtons(evt->buttons(), evt->button())); 12:  13: OgreWidgetMouseMovedSincePress = true; 14: }

     

      在第11行调用的OgitorsRoot::getSingletonPtr()->OnMouseMove(pos, getMouseButtons(evt->buttons(), evt->button())); 将坐标传递给OnMouseMove 在../Ogitor/src/OgitorsRootUtilityFunctions.cpp中定义的void OgitorsRoot::OnMouseMove (Ogre::Vector2 point, unsigned int buttons)point为鼠标在视口的坐标用(x,y)表示,坐标原点在左上角。 1: void OgitorsRoot::OnMouseMove (Ogre::Vector2 point, unsigned int buttons) 2: { 3: if(!mActiveViewport) 4: return; 5: Ogre::Vector4 rect; 6: mActiveViewport->getRect(rect); 7:  8: if((rect.x <= point.x) && (rect.y <= point.y) && ((rect.x + rect.z) >= point.x) && ((rect.y + rect.w) >= point.y)) 9: { 10: if(mMouseListener) 11: mMouseListener->OnMouseMove(mActiveViewport, point - Ogre::Vector2(rect.x,rect.y), buttons); 12: else 13: mActiveViewport->OnMouseMove(point - Ogre::Vector2(rect.x,rect.y), buttons); 14: } 15: else 16: { 17: if(mMouseListener) 18: mMouseListener->OnMouseLeave(mActiveViewport, point - Ogre::Vector2(rect.x,rect.y), buttons); 19: else 20: mActiveViewport->OnMouseLeave(point - Ogre::Vector2(rect.x,rect.y), buttons); 21: } 22: }

    如图所示:

    仅当加载有场景时才会调用OnMouseMove,并实时更新point 的值。OnMouseMove (Ogre::Vector2 point, unsigned int buttons)其中的 buttons 的值由getMouseButtons(evt->buttons(), evt->button())传递过来;判断鼠标按键对应值如下:

            OMB_LEFT = 1,       /** Left mouse button type */         OMB_RIGHT = 2,      /** Right mouse button type */         OMB_MIDDLE = 4      /** Middle mouse button type */

    在../qtOgitor/src/ogrewidget.cpp中

     

    1: unsigned int OgreWidget::getMouseButtons(Qt::MouseButtons buttons, Qt::MouseButton button) 2: { 3: unsigned int flags = 0; 4: buttons |= button; 5:  6: if(buttons.testFlag(Qt::LeftButton)) 7: flags |= OMB_LEFT; 8: if(buttons.testFlag(Qt::RightButton)) 9: flags |= OMB_RIGHT; 10: if(buttons.testFlag(Qt::MidButton)) 11: flags |= OMB_MIDDLE; 12:  13: return flags; 14: }

     

    在../Ogitor/include/OgitorsDefinitions.h中

    1: /** Ogitor mouse button enumeration */ 2: enum OgitorsMouseButtons 3: { 4: OMB_LEFT = 1, /** Left mouse button type */ 5: OMB_RIGHT = 2, /** Right mouse button type */ 6: OMB_MIDDLE = 4 /** Middle mouse button type */ 7: };
    最新回复(0)