1. osgQt的构造函数添加:setAttribute(Qt::WA_AcceptTouchEvents);//wyh
2. event()修改,支持触摸时间
bool GLWidget::event( QEvent* event ) { // QEvent::Hide // // workaround "Qt-workaround" that does glFinish before hiding the widget // (the Qt workaround was seen at least in Qt 4.6.3 and 4.7.0) // // Qt makes the context current, performs glFinish, and releases the context. // This makes the problem in OSG multithreaded environment as the context // is active in another thread, thus it can not be made current for the purpose // of glFinish in this thread. // QEvent::ParentChange // // Reparenting GLWidget may create a new underlying window and a new GL context. // Qt will then call doneCurrent on the GL context about to be deleted. The thread // where old GL context was current has no longer current context to render to and // we cannot make new GL context current in this thread. // We workaround above problems by deferring execution of problematic event requests. // These events has to be enqueue and executed later in a main GUI thread (GUI operations // outside the main thread are not allowed) just before makeCurrent is called from the // right thread. The good place for doing that is right after swap in a swapBuffersImplementation. if (event->type() == QEvent::Hide) { // enqueue only the last of QEvent::Hide and QEvent::Show enqueueDeferredEvent(QEvent::Hide, QEvent::Show); return true; } else if (event->type() == QEvent::Show) { // enqueue only the last of QEvent::Show or QEvent::Hide enqueueDeferredEvent(QEvent::Show, QEvent::Hide); return true; } else if (event->type() == QEvent::ParentChange) { // enqueue only the last QEvent::ParentChange enqueueDeferredEvent(QEvent::ParentChange); return true; } //wyh else if(event->type() == QEvent::TouchBegin ||event->type() == QEvent::TouchUpdate || event->type() == QEvent::TouchEnd) { QList<QTouchEvent::TouchPoint> touchPoints = static_cast<QTouchEvent *>(event)->touchPoints(); if(touchPoints.count() >= 2) { //test //std::cout << "touch multiViewer" << std::endl; //std::cout << std::endl; osg::ref_ptr<osgGA::GUIEventAdapter> osg_event(NULL); foreach (const QTouchEvent::TouchPoint &touchPoint, touchPoints) { QPointF touchPos = touchPoint.pos(); ////test //std::cout << "x:" << touchPos.x() << "\t" << "y:" << touchPos.y() << "\t"; if(touchPoint.state() == Qt::TouchPointPressed) { if (!osg_event) { osg_event = _gw->getEventQueue()->touchBegan( touchPoint.id(), osgGA::GUIEventAdapter::TOUCH_BEGAN, touchPos.x() , touchPos.y()); } else { osg_event->addTouchPoint( touchPoint.id(), osgGA::GUIEventAdapter::TOUCH_BEGAN, touchPos.x() , touchPos.y()); } } else if(touchPoint.state() == Qt::TouchPointMoved) { if (!osg_event) { osg_event = _gw->getEventQueue()->touchMoved( touchPoint.id(), osgGA::GUIEventAdapter::TOUCH_MOVED, touchPos.x(), touchPos.y()); } else { osg_event->addTouchPoint( touchPoint.id(), osgGA::GUIEventAdapter::TOUCH_MOVED, touchPos.x() , touchPos.y()); } } else if(touchPoint.state() == Qt::TouchPointReleased) { // No double tap detection with RAW TOUCH Events, sorry. if (!osg_event) { osg_event = _gw->getEventQueue()->touchEnded( touchPoint.id(), osgGA::GUIEventAdapter::TOUCH_ENDED, touchPos.x(), touchPos.y(), 1); } else { osg_event->addTouchPoint( touchPoint.id(), osgGA::GUIEventAdapter::TOUCH_ENDED, touchPos.x() , touchPos.y()); } } } return true; } } // perform regular event handling return QGLWidget::event( event ); }