From 6da42d9cd6c8e282f7868545063675a02b05c6a2 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 10 Mar 2010 13:24:53 +0000 Subject: [PATCH] From Wang Rui, QWidgetImage class that enables QWidgets to be used as an interactive osg::Image that can be assigned to textures. --- include/osgQt/QWidgetImage | 52 ++++++++++++++++++++++++ src/osgQt/CMakeLists.txt | 2 + src/osgQt/QGraphicsViewAdapter.cpp | 4 ++ src/osgQt/QWidgetImage.cpp | 65 ++++++++++++++++++++++++++++++ 4 files changed, 123 insertions(+) create mode 100644 include/osgQt/QWidgetImage create mode 100644 src/osgQt/QWidgetImage.cpp diff --git a/include/osgQt/QWidgetImage b/include/osgQt/QWidgetImage new file mode 100644 index 000000000..79ba0867a --- /dev/null +++ b/include/osgQt/QWidgetImage @@ -0,0 +1,52 @@ +/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2009 Robert Osfield + * + * This library is open source and may be redistributed and/or modified under + * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or + * (at your option) any later version. The full license is in LICENSE file + * included with this distribution, and on the openscenegraph.org website. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * OpenSceneGraph Public License for more details. +*/ + +#ifndef QWIDGETIMAGE +#define QWIDGETIMAGE + +#include +#include + +namespace osgQt +{ + +class OSGQT_EXPORT QWidgetImage : public osg::Image +{ + public: + + QWidgetImage( QWidget* widget=0 ); + + QWidget* getQWidget() { return _widget; } + QGraphicsViewAdapter* getQGraphicsViewAdapter() { return _adapter; } + + void focusWidget(bool focus); + + void clearWriteBuffer(); + + void render(); + + virtual void setFrameLastRendered(const osg::FrameStamp* frameStamp); + + virtual bool sendPointerEvent(int x, int y, int buttonMask); + + virtual bool sendKeyEvent(int key, bool keyDown); + + protected: + + QPointer _adapter; + QPointer _widget; +}; + +} + +#endif \ No newline at end of file diff --git a/src/osgQt/CMakeLists.txt b/src/osgQt/CMakeLists.txt index 649d4a9c5..a9fd068e4 100644 --- a/src/osgQt/CMakeLists.txt +++ b/src/osgQt/CMakeLists.txt @@ -20,6 +20,7 @@ SET(LIB_PUBLIC_HEADERS ${HEADER_PATH}/QFontImplementation ${HEADER_PATH}/QGraphicsViewAdapter ${HEADER_PATH}/QWebViewImage + ${HEADER_PATH}/QWidgetImage ) # FIXME: For OS X, need flag for Framework or dylib @@ -29,6 +30,7 @@ ADD_LIBRARY(${LIB_NAME} QFontImplementation.cpp QGraphicsViewAdapter.cpp QWebViewImage.cpp + QWidgetImage.cpp ${SOURCES_H_MOC} ${OPENSCENEGRAPH_VERSIONINFO_RC} ) diff --git a/src/osgQt/QGraphicsViewAdapter.cpp b/src/osgQt/QGraphicsViewAdapter.cpp index 3ecc5158d..e152137fb 100644 --- a/src/osgQt/QGraphicsViewAdapter.cpp +++ b/src/osgQt/QGraphicsViewAdapter.cpp @@ -12,6 +12,7 @@ */ #include +#include #include #include @@ -309,6 +310,9 @@ bool QGraphicsViewAdapter::handlePointerEvent(int x, int y, int buttonMask) if (eventType==QEvent::MouseButtonPress) { + QWidgetImage* qwidgetImage = dynamic_cast(_image.get()); + if (qwidgetImage) qwidgetImage->focusWidget(true); + QWebViewImage* qwebViewImage = dynamic_cast(_image.get()); if (qwebViewImage) qwebViewImage->focusBrowser(true); } diff --git a/src/osgQt/QWidgetImage.cpp b/src/osgQt/QWidgetImage.cpp new file mode 100644 index 000000000..95743da97 --- /dev/null +++ b/src/osgQt/QWidgetImage.cpp @@ -0,0 +1,65 @@ +/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2009 Robert Osfield + * + * This library is open source and may be redistributed and/or modified under + * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or + * (at your option) any later version. The full license is in LICENSE file + * included with this distribution, and on the openscenegraph.org website. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * OpenSceneGraph Public License for more details. +*/ + +#include +#include + +namespace osgQt +{ + +QWidgetImage::QWidgetImage( QWidget* widget ) +{ + // make sure we have a valid QApplication before we start creating widgets. + getOrCreateQApplication(); + + QVBoxLayout* layout = new QVBoxLayout; + if (widget) layout->addWidget(widget); + + _widget = new QWidget; + _widget->setLayout(layout); + _widget->setGeometry(0, 0, 800, 600); // FIXME: a different size leads to unexpected result + _adapter = new QGraphicsViewAdapter(this, _widget.data()); +} + +void QWidgetImage::focusWidget(bool focus) +{ + QFocusEvent event(focus ? QEvent::FocusIn : QEvent::FocusOut, Qt::OtherFocusReason); + QCoreApplication::sendEvent(_widget, &event); +} + +void QWidgetImage::clearWriteBuffer() +{ + _adapter->clearWriteBuffer(); +} + +void QWidgetImage::render() +{ + _adapter->render(); +} + +void QWidgetImage::setFrameLastRendered(const osg::FrameStamp* frameStamp) +{ + _adapter->setFrameLastRendered(frameStamp); +} + +bool QWidgetImage::sendPointerEvent(int x, int y, int buttonMask) +{ + return _adapter->sendPointerEvent(x,y,buttonMask); +} + +bool QWidgetImage::sendKeyEvent(int key, bool keyDown) +{ + return _adapter->sendKeyEvent(key, keyDown); +} + +}