Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Check if a Key is Down with Qt

I am playing around with some graphics, and I have implemented simple camera movement with the arrow keys. My first approach was to override keyPressEvent to do something like this:

switch(key)
{
   case up: MoveCameraForward(step); break;
   case left: MoveCameraLeft(step); break;
   ...
}

This doesn't work as I wish it would. When I press and hold, for example, the forward key, the camera moves forward "step" units, then halts for a while and then continues moving. I am guessing that this is how the event is generated, in order to avoid multiple events in case of a little bit long keypress.

So, I need to poll the keyboard in my Paint() routine. I haven't found how to do it with Qt. I thought of having a map<Key, bool> which would be updated in keyPressEvent and keyReleaseEvent and poll that map in Paint(). Any better ideas? Thanks for any insights.

like image 466
Armen Tsirunyan Avatar asked Sep 12 '11 22:09

Armen Tsirunyan


4 Answers

This doesn't solve the general problem of detecting which keys are pressed, but if you are only looking for keyboard modifiers (shift, ctrl, alt, etc.), you can retrieve that through the static QApplication::keyboardModifiers() and QApplication::queryKeyboardModifiers() methods.

like image 170
Nathan Avatar answered Sep 27 '22 16:09

Nathan


So, I need to poll the keyboard in my Paint() routine. I haven't found how to do it with Qt. I thought of having a map which would be updated in keyPressEvent and keyReleaseEvent and poll that map in Paint().

Your second method is what I would have done, except that I would use a continuous, periodic QTimer event to poll the keyboard-pressed map and call QWidget::Update() function when necessary to invalidate the display widget instead. Performing non-painting operations inside Paint() is strongly discouraged for many reasons but I do not know how to explain that well.

like image 44
ksming Avatar answered Sep 26 '22 16:09

ksming


There is no Qt API for checking whether a key is pressed or not. You may have to write separate code for different platforms and add a bit of #ifdef logic.

On Windows you can use GetKeyState() and GetKeyboardState(), both declared in windows.h.

like image 33
Johan Råde Avatar answered Sep 28 '22 16:09

Johan Råde


This is not straight forward when using Qt, but the Gluon team has been working on exactly that problem (along with a bunch of others). GluonInput solves the issue, and is available as part of Gluon: http://gluon.gamingfreedom.org/ It is also a nice, Qt-like API, so while it's an extra dependency, it should be possible for you to use it.

like image 29
leinir Avatar answered Sep 26 '22 16:09

leinir