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: };