2012-07-23 47 views
4

我知道,使用grabKeyboard()我的Widget能夠抓住每個鍵盤事件,如果它沒有集中,但如果我想捕獲只有三個或四個鍵?Qt Widget - 如何捕捉只有幾個鍵盤按鍵

我試圖與事件過濾器 http://doc.trolltech.com/3.3/qobject.html#installEventFilter

,但沒有工作(因爲我安裝了它這樣的吧?)

class MyWidget: public QGLWidget 
    { 
     ... 
    protected: 
     bool eventFilter(QObject *o, QEvent *e); 
    }; 

    bool MyWidget::eventFilter(QObject *o, QEvent *e) 
    { 
     if (e->type() == QEvent::KeyPress) { 
      // special processing for key press 
      QKeyEvent *k = (QKeyEvent *)e; 
      qDebug("Ate key press %d", k->key()); 
      return TRUE; // eat event 
     } else { 
      // standard event processing 
      return FALSE; 
     } 
    } 

// Installed it in the constructor 
MyWidget::MyWidget() 
{ 
    this->installEventFilter(this); 
} 

如何我可以在插件攔截只是幾個鍵剩下的其他小部件(QTextEdits)?

回答

6

你自己的評論說,這一切:

return TRUE; // eat event 

當您返回true所有按鍵,事件不會進一步處理。對於您不想處理的所有密鑰,您必須返回false

的另一種方式,而不事件過濾器,但重新實現keyPressEvent:

void MyWidget::keyPressEvent(QKeyEvent* event) { 
    switch (event->key()) { 
    case Qt::Key_X: 
     //act on 'X' 
     break; 
    case Qt::Key_Y: 
     //act on 'Y' 
     break; 
    default: 
     event->ignore(); 
     break; 
    } 
} 
+0

你寫的第二種方式。我做到了!但不知何故,「忽略」不是將密鑰轉發給其他小部件,而grabKeyboard()保持「吃」所有事件,也忽略了這些事件。 – 2012-07-23 20:08:20

+0

我用你的幫助解決了問題,現在我「grabKeyboard()」只是當過濾器告訴我openGL小部件具有焦點時(即用戶點擊了它),謝謝! – 2012-07-23 20:20:15