天天看點

Qt利用eventFilter函數屏蔽子控件自帶鍵盤響應,隻允許自定義鍵盤響應

        最近寫項目遇到一個問題,添加了一個QGraphicsView控件,自定義鍵盤事件使Item可以上下左右移動,但實際由于QGraphicsView自帶上下左右的鍵盤事件響應,導緻自己寫的事件被劫持,壓根傳不到視窗。

        解決辦法想到的是:安裝事件過濾器,将QGraphicsView自帶的上下左右鍵盤事件屏蔽掉,但是這樣做的結果就是連自定義的鍵盤事件都給屏蔽了,後來突發奇想:直接将鍵盤按壓事件寫在過濾器裡面不就好了,試了一下,果真有用,話不多說直接上代碼:

//.h檔案安裝事件過濾器
protected:
    bool eventFilter(QObject *obj, QEvent *event);



//.cpp重寫事件過濾器
bool MainWindow_Cam::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == ui->imgGraphicsView)
    {
        if (event->type() == QEvent::KeyPress)
        {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
            if(keyEvent->key() == Qt::Key_Right)
            {
                m_keyFlag = 1;//這可以添加自己的代碼,我的是按右鍵改變m_keyFlag值
            }
            if(keyEvent->key() == Qt::Key_Left)
            {
                m_keyFlag = 2;
            }
            if(keyEvent->key() == Qt::Key_Up)
            {
                m_keyFlag = 3;
            }
            if(keyEvent->key() == Qt::Key_Down)
            {
                m_keyFlag = 4;
            }

            return true;/一定要傳回true,辨別執行過濾
        }
        else
        {
            return false;
        }
    }
    else
    {
        // pass the event on to the parent class
        return QMainWindow::eventFilter(obj, event);
    }
}
           

然後再在構造函數裡加上:

ui->imgGraphicsView->installEventFilter(this);
           

這樣就可以了

繼續閱讀