2011-10-24 35 views
6

Tôi có một lớp được thừa kế QWidget như vậy:Qt đáp ứng với keyPressEvent trong con 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(); 
    } 
} 

Sau đó, tôi có lớp main_window tôi:

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); 
} 

Câu hỏi của tôi là, làm thế nào để tôi có được keyPressEvent trong tiện ích tetris_canvas của tôi để phản hồi một lần nhấn phím?

Tôi đang vẽ bên trong canvas đó và tôi cần trả lời các lần nhấn phím để người dùng có thể tương tác với mọi thứ trên canvas đó.

Tiện ích được thêm vào số QGridLayout trong ctor hoặc lớp main_window của tôi.

Trả lời

9

Các QWidget::keyPressEvent nói điều này:

Một widget phải gọi setFocusPolicy() chấp nhận tập trung ban đầu và có trọng tâm để nhận được một sự kiện nhấn phím.

Vì vậy, bạn nên làm điều đó. (. Vì bạn sẽ không hiển thị nhà thầu của bạn, tôi đoán bạn bị mất phần đó)

Cũng dòng sau đó nói:

Nếu bạn reimplement xử lý này, nó là rất quan trọng mà bạn gọi việc thực hiện lớp cơ sở nếu bạn không hành động trên khóa.

Bạn đang thiếu trong tiện ích của mình nhưng thực hiện trong cửa sổ chính. Hãy chắc chắn rằng bạn làm điều đó ở cả hai nơi.

Các vấn đề liên quan