連按問題
最近幫同學的機器人寫了一個串口遙控器
其實就是對一個Qt下的串口模塊進行了簡單的發送封裝

在按鍵響應連按的時候遇到了一些問題
即重寫了keyPressEvent(QKeyEvent *event)和keyPressRelease(QKeyEvent *event)
但是在具體使用調試的時候,連按會出現問題
在網上尋找方法之后知道Qt對鍵盤事件的響應與其他GUI庫有一些區別
例如我在按下'A'時,會響應一個‘event->key() == Qt::Key_A’事件,在該事件之前調用keyPressEvent( ),在該事件之后調用keyReleaseEvent( ),表現在程序上就是不斷地交替響應Press,Release,Press,Release。
所以問題在這里:那么在Qt中要保證連按的時候只響應Press,連按放下的時候響應一次Releaseh該如何處理?
還好,Qt中還提供了一個isAutoRepeat( )方法,按鍵松開時返回false,保持連按返回true。
則使用標志位進行處理
keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_A && !event->isAutoRepeat())
{
if (!mPressFlag_A)
{
mKeyDirection.x = -1;
//其他鍵盤事件
}
mPressFlag_A = true;
}
}
keyPressEvent(QKeyEvent *event)
{
if (e->key() == Qt::Key_A && mKeyDirection.x == -1 && !e->isAutoRepeat())
{
if (mPressFlag_A)
{
mKeyDirection.x = 0;//這里就是真正按鍵釋放觸發的事件
}
mPressFlag_A = false;
}
void keyPressEvent(QKeyEvent *event);
}
這樣即可以完美解決這個問題
Enter鍵的響應問題
另外一個比較坑的地方是我寫登錄界面的時候,把回車鍵clicked與確認按鈕進行綁定
if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) //Enter鍵的捕獲比較特殊,要兩個同時關聯
{
//響應事件代碼
}
Enter的響應比較特殊,而Esc可以直接用Qt::Key_Esc進行判定
QWidget控件下的鍵盤響應問題
因為前一個項目直接在QMainWindow下面寫的鍵盤事件,沒有任何問題
這次的項目是在QWidget下面重寫的,沒有產生效果
考慮到類似其他GUI處理鼠標光標的情況,考慮是事件焦點的問題
這里沒有系統進行學習,找到了兩個解決辦法
- 是在Widget的屬性下面,將focusPolicy改成StrongFocus即可
Widget->setFocusPolicy(Qt::StrongFocus);