From dac3b33efba7872ab5ff1f458e3248632e4d2edf Mon Sep 17 00:00:00 2001 From: scrawl Date: Fri, 18 Sep 2015 18:29:40 +0200 Subject: [PATCH] OpenCS: Pass events from the QGLWidget to the RenderWidget --- apps/opencs/view/render/scenewidget.cpp | 21 +++++++++++++++++++++ apps/opencs/view/render/scenewidget.hpp | 2 ++ 2 files changed, 23 insertions(+) diff --git a/apps/opencs/view/render/scenewidget.cpp b/apps/opencs/view/render/scenewidget.cpp index 0a5087998..fb3bcb3c3 100644 --- a/apps/opencs/view/render/scenewidget.cpp +++ b/apps/opencs/view/render/scenewidget.cpp @@ -56,6 +56,9 @@ RenderWidget::RenderWidget(QWidget *parent, Qt::WindowFlags f) layout->addWidget(window->getGLWidget()); setLayout(layout); + // Pass events through this widget first + window->getGLWidget()->installEventFilter(this); + mView->getCamera()->setGraphicsContext(window); mView->getCamera()->setClearColor( osg::Vec4(0.2, 0.2, 0.6, 1.0) ); mView->getCamera()->setViewport( new osg::Viewport(0, 0, traits->width, traits->height) ); @@ -94,6 +97,24 @@ void RenderWidget::setVisibilityMask(int mask) mView->getCamera()->setCullMask(mask<<1); } +bool RenderWidget::eventFilter(QObject* obj, QEvent* event) +{ + // handle event in this widget, is there a better way to do this? + if (event->type() == QEvent::MouseButtonPress) + mousePressEvent(static_cast(event)); + if (event->type() == QEvent::MouseButtonRelease) + mouseReleaseEvent(static_cast(event)); + if (event->type() == QEvent::MouseMove) + mouseMoveEvent(static_cast(event)); + if (event->type() == QEvent::KeyPress) + keyPressEvent(static_cast(event)); + if (event->type() == QEvent::KeyRelease) + keyReleaseEvent(static_cast(event)); + + // Always pass the event on to GLWidget, i.e. to OSG event queue + return QObject::eventFilter(obj, event); +} + // -------------------------------------------------- CompositeViewer::CompositeViewer() diff --git a/apps/opencs/view/render/scenewidget.hpp b/apps/opencs/view/render/scenewidget.hpp index 54f001c15..63da01a45 100644 --- a/apps/opencs/view/render/scenewidget.hpp +++ b/apps/opencs/view/render/scenewidget.hpp @@ -45,6 +45,8 @@ namespace CSVRender void setVisibilityMask(int mask); + bool eventFilter(QObject *, QEvent *); + protected: osg::ref_ptr mView;