Qt鍵盤響應事件中的連按問題


連按問題

最近幫同學的機器人寫了一個串口遙控器

其實就是對一個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處理鼠標光標的情況,考慮是事件焦點的問題
這里沒有系統進行學習,找到了兩個解決辦法

  1. 是在Widget的屬性下面,將focusPolicy改成StrongFocus即可
  2. Widget->setFocusPolicy(Qt::StrongFocus);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM