最近寫項目遇到一個問題,添加了一個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);
這樣就可以了