2011-09-12 37 views
8

私はいくつかのグラフィックスで遊んでいますが、矢印キーで簡単なカメラの動きを実装しました。Qtでキーが押されていないか確認してください

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

私はそれがほしいので、これは動作しません:私の最初のアプローチは、このような何かをkeyPressEventを上書きすることでした。たとえば、前方キーなどを押し続けると、カメラは前方に「ステップ」単位を移動し、しばらく停止してから移動を続けます。私はこれがイベントが生成される方法であると推測しています。これは少し長いキー操作の場合に複数のイベントを回避するためです。

したがって、Paint()ルーチンでキーボードをポーリングする必要があります。私はQtでそれを行う方法を見つけていません。私はmap<Key, bool>を持っていると思って、keyPressEventkeyReleaseEventに更新され、そのマップをPaint()に投票しました。どんな良いアイデアですか?どんな洞察にも感謝します。

答えて

6

したがって、Paint()ルーチンでキーボードをポーリングする必要があります。私は見つけていない Qtでそれを行う方法。私は のkeyPressEventとkeyReleaseEventを更新し、そのマップを Paint()にポーリングすると考えました。

あなたの第二の方法は、私がキーボードプレスマップをポーリングし、QWidgetのを呼び出すために継続的、定期的QTimerイベントを使用することを除いて、私は、行っているだろうかです::更新()関数で表示ウィジェットを無効にする必要が代わりに。ペイント()内のペイント以外の操作を実行することは、多くの理由で強く推奨されていませんが、それをうまく説明する方法はわかりません。

+0

ユーザーがキーボードの繰り返しレートを設定できるので、これは特に推奨されます。これは内部のティックレートから独立していることを保証する唯一の方法です。 – RedX

+0

qtフォーラムにスレッドとその例があります:http://qt-project.org/forums/viewreply/135346/ – bobbaluba

2

これはQtを使用するときには簡単ではありませんが、Gluonチームはその問題を(他の多数のものとともに)正確に処理しています。 GluonInputはこの問題を解決し、Gluonの一部として利用できます:http://gluon.gamingfreedom.org/これは素晴らしいQtのようなAPIなので、余分な依存関係ですが、それを使用することは可能です。

3

キーが押されているかどうかをチェックするためのQt APIはありません。 プラットフォームごとに別々のコードを書いて、#ifdefロジックを少し追加する必要があります。

WindowsではとGetKeyboardState()の両方をwindows.hで宣言して使用できます。

関連する問題