QT + OSG实现触屏旋转和双指缩放

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();
}
发布了34 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Sparrow_du/article/details/100105299
今日推荐