2011-10-24 7 views
6

ho una classe derivata QWidget come tale:Qt rispondere alle keyPressEvent nel bambino 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(); 
    } 
} 

allora ho la mia classe 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); 
} 

La mia domanda è, come ottengo il keyPressEvent nel mio widget tetris_canvas per rispondere a una pressione di un tasto?

Sto disegnando all'interno di quella tela e ho bisogno di rispondere a pressioni dei tasti in modo che l'utente possa interagire con le cose su quella tela.

Il widget viene aggiunto a un QGridLayout nel ctor o nella mia classe main_window.

risposta

9

Il QWidget::keyPressEvent dice questo:

Un widget deve chiamare setFocusPolicy() ad accettare attenzione inizialmente e avere attenzione al fine di ricevere un evento di pressione di un tasto.

Quindi dovresti farlo. (. Dal momento che non sta mostrando i tuoi costruttori, sto cercando di indovinare vi siete persi questa parte)

Anche la linea dopo che dice:

Se reimplementare questo gestore, è molto importante che si chiama l'implementazione della classe base se non si interviene sulla chiave.

Ti manca quello nel tuo widget, ma lo fai nella tua finestra principale. Assicurati di farlo in entrambi i posti.