2011-10-24 13 views
6

tengo una clase derivada QWidget como tal:Qt responder a keyPressEvent en niños 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(); 
    } 
} 

entonces tengo mi clase 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); 
} 

Mi pregunta es, ¿cómo consigo el keyPressEvent en mi widget tetris_canvas para responder a presionar una tecla?

Estoy dibujando dentro de ese lienzo y tengo que responder a las pulsaciones de teclas para que el usuario pueda interactuar con las cosas en ese lienzo.

El widget se agrega a un QGridLayout en el ctor o en mi clase main_window.

Respuesta

9

El QWidget::keyPressEvent dice esto:

Un widget debe llamar setFocusPolicy() a aceptar el foco al principio y tener el foco a fin de recibir un evento de pulsación de tecla.

Así que debes hacer eso. (. Puesto que no se está mostrando sus constructores, supongo que se ha perdido esa parte)

también la línea después de que dice:

Si reimplementar este controlador, es muy importante que llame la implementación de la clase base si no actúa sobre la clave.

Lo que hace falta en su widget, pero hacerlo en la ventana principal. Asegúrate de hacerlo en ambos lugares.

Cuestiones relacionadas