2011-09-12 23 views
8

我在玩一些圖形,並且用箭頭鍵實現了簡單的攝像機移動。我的第一種方法是重寫keyPressEvent做這樣的事情:用Qt檢查一個按鍵是否關閉

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

,因爲我希望它這是行不通的。例如,當按住前進鍵時,相機向前移動「步進」單位,然後暫停一段時間然後繼續移動。我猜測這就是事件的產生方式,爲了避免多次事件發生,只要按下一點點按鍵。

所以,我需要在我的Paint()例程中輪詢鍵盤。我還沒有找到如何與Qt做。我想有一個map<Key, bool>這將在keyPressEventkeyReleaseEvent更新和輪詢該地圖Paint()。任何更好的想法?感謝您的任何見解。

回答

6

所以,我需要在我的Paint()例程中輪詢鍵盤。我還沒有找到 如何用Qt做到這一點。我想有一個在keyPressEvent和keyReleaseEvent中更新 的地圖,並在 Paint()中輪詢映射。

你的第二個方法是什麼,我會做,但我會用一個連續的,週期性的QTimer事件輪詢鍵盤按下地圖和調用QWidget :: update()函數在必要時無效顯示控件代替。在Paint()內執行非繪畫操作的原因很多,但我不知道如何解釋。

+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上,您可以使用GetKeyState()GetKeyboardState(),均在windows.h中聲明。