Polling for SDL events in a custom QObject-derived C++ class?



  • I'm in the process of writing a QML/QtQuick application, and my goal is to be able to control this app with a variety of input devices; including some that don't seem to be officially supported by Qt like gamepad/joystick input.

    It seems that the best way to go about this might be to create a new QObject-derived class in C++ that wraps "SDL's Event System":http://www.libsdl.org/release/SDL-1.2.15/docs/html/sdlevent.html, independently checking for gamepad/joystick events and emitting signals to be used by my other QObject/QML instances.

    I'm pretty new to Qt/QML still, so I'm not sure of the right way to go about this though. Every frame/update I need my QObject class to call SDL_PollEvent() in a loop (in order to retrieve each event from the internal event queue). After I poll events, I need to process the event to determine what type of event it was. After that, my plan is to emit a Qt signal specific to the event that was just processed (for example: onJoyPadLeft() signal or onJoyPadButton5() signal).

    I think I could probably make a new thread that constantly polls/processes SDL events. However, I don't want to do that if there is a better way that's built into QObjects. Is there some kind of QObject function that's called each frame/update that I can use/overwrite for the sake of polling/processing SDL events? Or should I make a new thread that runs its own event-handling loop?



  • If the API that you are using for polling events is blocking, then a thread is the only option. Otherwise you can install a even filter at either the QApplication or your top level widget and do you work whenever a paint event comes.

    In case of QML, I dont remember the exact details but scenegraph renders emit frame start and frameend signals. A simple search on google should give you the exact api.

    Just be aware if the poll method will take a long time thread approach will be better


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.