[osg-users] OSG 3.2.1 and Qt5 Widget integration

Sebastian Messerschmidt sebastian.messerschmidt at gmx.de
Mon Aug 3 08:31:50 PDT 2015


Hi Pierre,
> Hi Sebastian,
>
> I use Qt 5 and OSG 3.2.1 with no problem passing the key events from 
> Qt to OSG.
>
> In your Qt widget subclass you'll have a method which gets the key 
> events:
> void keyPressEvent(QKeyEvent* e)
> {
>         const char *keyData = e->text().toLatin1().data();
> gw->getEventQueue()->keyPress(osgGA::GUIEventAdapter::KeySymbol(*keyData)); 
>
> }
> provided that gw is your osgViewer::GraphicsWindow.
>
> Note that for the meta keys (like ALT, CTRL, SHIFT), you'll have to 
> check something like:
>  switch(e->key())
>     {
>     case Qt::Key_Shift:
>         key = osgGA::GUIEventAdapter::KEY_Shift_L; //left key is 
> chosen in an arbitrary way since Qt doesn't differ left or right
>         break;
>     case Qt::Key_Control :
>         key = osgGA::GUIEventAdapter::KEY_Control_L;
>         break;
>     case Qt::Key_Alt :
>         key = osgGA::GUIEventAdapter::KEY_Alt_L;
>         break;
>     }
> since there is no "value" in e->text().
>
> And the same can be achieved for the keyReleaseEvent, 
> mousePress/ReleaseEvent, etc. by creating a new GUIEventAdapter from 
> the Qt event and then send it to the event queue.
Okay, I have implemented this almost like this.
The only thing I don't understand is why it was working out of the box 
(having a qwidget holding the osg::Viewer::GraphicsWindow) without 
manually pushing the events.

Thanks for documenting ;-)

Cheers
Sebastian
>
> Hope that helps.
>
> Cheers
> Pierre-Jean
>
>
> Le 03/08/2015 17:01, Sebastian Messerschmidt a écrit :
>> Am 03.08.2015 um 16:57 schrieb Can Olcek:
>>> Hi Sebastian,
>>>
>>> I have almost completed the example. My original implementation is a 
>>> little bit complex than this. Thanks to the couple of private 
>>> replies and discussion, I will post it tomorrow.
>>>
>>> But for keyboard inputs, I'm using an event filter.
>>
>> Okay, I know how to use EventFilters etc.
>> The point is, that the qt4 implementation somehow passed the events 
>> to OSG, while the qt5 seems to fail to pass any keys.
>>
>> Cheers
>> Sebastian
>>>
>>> Something like this:
>>>
>>>
>>> Code:
>>>
>>>
>>> class QInputFilter : public QObject
>>> {
>>>    Q_OBJECT
>>>
>>> protected:
>>>    bool eventFilter(QObject *obj, QEvent *event);
>>>
>>>    void onKeyPress(QKeyEvent *e);
>>>    void onKeyRelease(QKeyEvent *e);
>>> };
>>>
>>> bool QInputFilter::eventFilter(QObject *obj, QEvent *event)
>>> {
>>>    switch(event->type())
>>>    {
>>>      case QEvent::KeyPress:
>>>        onKeyPress(static_cast<QKeyEvent *>(event));
>>>        break;
>>>      case QEvent::KeyRelease:
>>>        onKeyRelease(static_cast<QKeyEvent *>(event));
>>>        break;
>>>    }
>>>      return QObject::eventFilter(obj, event);
>>> }
>>>   void QInputFilter::onKeyPress(QKeyEvent *e)
>>> {
>>>    if(e->isAutoRepeat())
>>>    {
>>>      e->ignore();
>>>      return;
>>>    }
>>>      unsigned int key = e->key();
>>>    // add pressed keys and add changed keys for current frame
>>>    // renderwidget will clear changed keys at the end of frame
>>>    Input::PrivateAccess::pressedKeys().insert(key);
>>>    Input::PrivateAccess::changedKeys().insert(key);
>>>          e->accept();
>>> }
>>>   void QInputFilter::onKeyPress(QKeyEvent *e)
>>> {
>>>    if(e->isAutoRepeat())
>>>    {
>>>      e->ignore();
>>>      return;
>>>    }
>>>      unsigned int key = e->key();
>>>    // remove released keys and add changed keys for current frame
>>>    // renderwidget will clear changed keys at the end of frame
>>>    Input::PrivateAccess::pressedKeys().erase(e->key());
>>>    Input::PrivateAccess::changedKeys().insert(e->key());
>>>
>>>    e->accept();
>>> }
>>>
>>>
>>>
>>>
>>>
>>> Add input listener to your Qt app:
>>>
>>>
>>> Code:
>>>
>>>
>>> sdt::Author::QInputFilter inputFilter;
>>> app.installEventFilter(&inputFilter);
>>>
>>>
>>>
>>>
>>>
>>> I have almost fully static Input class to access keys and mouse 
>>> states during each frame (paintGL()) I've actually tried to 
>>> implement Unity3D like approach so inside cull or update traversal I 
>>> can use Input::getButton(), Input::getKey(), Input::isKeyUp(), etc. 
>>> methods.
>>>
>>> I can add full implemention of this to my full example.
>>>
>>> Cheers,
>>> Can
>>>
>>> ------------------
>>> Read this topic online here:
>>> http://forum.openscenegraph.org/viewtopic.php?p=64591#64591
>>>
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> osg-users mailing list
>>> osg-users at lists.openscenegraph.org
>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org 
>>>
>>
>> _______________________________________________
>> osg-users mailing list
>> osg-users at lists.openscenegraph.org
>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org 
>>
>
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org




More information about the osg-users mailing list