1、为了能够触发触屏事件,需要将窗口属性设为Qt::WA_AcceptTouchEvents
setAttribute(Qt::WA_AcceptTouchEvents);
2、重新实现event
bool OsgContainer::event(QEvent *event)
{
QEvent::Type type = event->type();
if(type != QEvent::TouchBegin && type != QEvent::TouchUpdate && type != QEvent::TouchEnd) return QOpenGLWidget::event(event);
QList<QTouchEvent::TouchPoint> touchPoints = static_cast<QTouchEvent *>(event)->touchPoints();
debug() << "type:" << type << " size:" <<touchPoints.size();
if(touchPoints.size() == 1) {
mouse_touch = false;
return true;
}
switch(type) {
case QEvent::TouchBegin:{
event->accept();
mouse_touch = true;
qreal v_x = touchPoints.at(1).pos().x() - touchPoints.at(0).pos().x();
qreal v_y = touchPoints.at(1).pos().y() - touchPoints.at(0).pos().y();
mouse_point_distance = qSqrt(v_x * v_x + v_y * v_y);
return true;
}
case QEvent::TouchUpdate:{
event->accept();
qreal u_x = touchPoints.at(1).pos().x() - touchPoints.at(0).pos().x();
qreal u_y = touchPoints.at(1).pos().y() - touchPoints.at(0).pos().y();
qreal u_distance = qSqrt(u_x * u_x + u_y * u_y);
osg::ref_ptr<osg::MatrixTransform> link_base = this->getRoot()->getChild(0)->asTransform()->asMatrixTransform();
if(u_distance > mouse_point_distance){
qreal scale = (u_distance - mouse_point_distance)/width() > 0.1 ? 0.1 : (u_distance - mouse_point_distance)/width();
link_base->setMatrix(osg::Matrix::scale(1 + scale, 1 + scale, 1 + scale) * link_base->getMatrix());
} else {
qreal scale = (mouse_point_distance -u_distance)/width() > 0.1 ? 0.1 : (mouse_point_distance -u_distance)/width();
link_base->setMatrix(osg::Matrix::scale(1-scale, 1-scale, 1-scale) * link_base->getMatrix());
}
return true;
}
case QEvent::TouchEnd:{
event->accept();
mouse_point_distance = 0;
mouse_touch = false;
return true;
}
default:
return QOpenGLWidget::event(event);
}
}
3、重新实现鼠标press和move事件
void OsgContainer::mousePressEvent(QMouseEvent *event)
{
int button = 0;
osg::ref_ptr<osg::Vec3dArray> pVec3dArray = new osg::Vec3dArray();
switch (event->button()) {
case Qt::LeftButton: {
button = 1;
last_x = event->x();
last_y = event->y();
pick_earth = true;
break;
}
case Qt::MidButton: button = 2; break;
case Qt::RightButton: button = 3; break;
case Qt::NoButton: button = 0; break;
default: button = 0; break;
}
setKeyboardModifiers(event);
window->getEventQueue()->mouseButtonPress(event->x(), event->y(), button);
update();
}
void OsgContainer::mouseMoveEvent(QMouseEvent *event)
{
if(pick_earth && !mouse_touch && (qAbs(event->x() - last_x) > qAbs(event->y() - last_y))) {
osg::ref_ptr<osg::MatrixTransform> link_base = this->getRoot()->getChild(0)->asTransform()->asMatrixTransform();
link_base->setMatrix(osg::Matrix::rotate(osg::DegreesToRadians((double)((event->x() - last_x) * 0.1)),0.0, 0.0, 1.0)
* link_base->getMatrix());
}
setKeyboardModifiers(event);
QOpenGLWidget::mouseMoveEvent(event);
update();
}