Your third approach seems to be correct since you aren't using animations.
Use QKeyEvent::isAutoRepeat () to find out if your handling an 'real' key press.
For fluid motion when a key is pressed i suggest you start a timer when a key is pressed and kill it when all keys have been released. You could use a QSet to keep track of pressed keys.

Qt Code:
  1. //member
  2. QSet<int> pressedKeys;
  3.  
  4. void keyPressEvent(QKeyEvent* e)
  5. {
  6. if(e->isAutoRepeat())
  7. return;
  8. if(pressedKeys.isEmpty())
  9. startTimer(40);
  10. pressedKeys.insert(e->key());
  11. }
  12.  
  13. void timerEvent(QTimerEvent* e)
  14. {
  15. if(pressedKeys.contains(Qt::Key_Up))
  16. ...;
  17. if(pressedKeys.contains(Qt::Key_Left))
  18. ...;
  19. updateGL();
  20. }
  21.  
  22. void keyReleaseEvent(QKeyEvent* e)
  23. {
  24. pressedKeys.remove(e->key());
  25. if(pressedKeys.isEmpty())
  26. startTimer(40);
  27. }
To copy to clipboard, switch view to plain text mode 
This way you should be able to catch any combination of keys being pressed.