2011-10-24 56 views
6

我有一個QWidget派生類這樣:Qt來keyPressEvent應對兒童QWidget的

class tetris_canvas : public QWidget 
{ 
    Q_OBJECT 

public: 
    tetris_canvas(QWidget * parent = 0); 
    ~tetris_canvas(); 

protected: 
    void paintEvent(QPaintEvent *event); 
    void keyPressEvent(QKeyEvent *event); 
}; 

//Never hits this keyPressEvent!!! 
void tetris_canvas::keyPressEvent(QKeyEvent * event) 
{ 
    if (event->key() == Qt::Key_Down) 
    { 
     rect->moveBottom(20); 
     update(); 
    } 
} 

然後,我有我的main_window類:

class main_window : public QWidget 
{ 
    Q_OBJECT 

public: 
    main_window(QWidget* parent = 0, Qt::WFlags flags = 0); 
    ~main_window(); 

protected: 
    void keyPressEvent(QKeyEvent * event); 
}; 

//This keyPressEvent is hit! 
void main_window::keyPressEvent(QKeyEvent* event) 
{ 
    if (event->key() == Qt::Key_Escape) 
    { 
     QApplication::exit(0); 
    } 
    QWidget::keyPressEvent(event); 
} 

我的問題是,我該如何得到keyPressEvent在我的tetris_canvas小部件中響應按鍵?

我正在繪製該畫布,我需要響應按鍵,以便用戶可以與該畫布上的事物進行交互。

小部件被添加到ctor中的QGridLayout或我的main_window類中。

回答

9

QWidget::keyPressEvent這樣說:

一個小部件必須調用setFocusPolicy()最初接受焦點,並且爲了獲得一個按鍵事件具有焦點。

所以你應該這樣做。 (既然你不顯示你的構造函數,我猜你錯過的那部分)

而且之後該行稱:

如果重新實現此處理,這是非常重要的,你打電話基類的實現,如果你不採取行動的關鍵。

你錯過了你的小部件,但在你的主窗口中。確保你在兩個地方都做到了。