2010-04-28 22 views
19

Estoy intentando por media eternidad ahora anulando la función QWidgets keyPressEvent en QT pero simplemente no funcionará. Tengo que decir que soy nuevo en el CPP, pero sé ObjC y el nivel C.QWidget keyPressEvent anulación

Mi problema es el siguiente:

class QSGameBoard : public QWidget { 
Q_OBJECT 

public: 
    QSGameBoard(QWidget *p, int w, int h, QGraphicsScene *s); 

signals: 
    void keyCaught(QKeyEvent *e); 

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

QSGameBoard es mi QWidget subclase y necesito para anular el keyPressEvent y fuego una SEÑAL en cada evento para notificar a algunos objetos registrados.

Mi keyPressEvent reemplaza en QSGameBoard.cpp se parece a esto:

void QSGameBoard::keyPressEvent(QKeyEvent *event) { 
    printf("\nkey event in board: %i", event->key()); 
    //emit keyCaught(event); 
} 

cuando cambio QSGameBoard :: :: QWidget a que recibe los eventos, pero no puedo emitir la señal ya que el compilador se queja sobre el alcance . Y si lo escribo así, la función no se llama en absoluto.

¿Cuál es el problema aquí?

+0

Ha aceptado la respuesta incorrecta. – user763305

Respuesta

13

EDIT: Como señalaron otros usuarios, el método que describí originalmente no es la forma correcta de resolver esto. respuesta por Vasco Rinaldo

Uso Conjunto del FocusPolicy a Qt :: ClickFocus para obtener el keybordfocus por kilómetro ratón. setFocusPolicy (Qt :: ClickFocus);

La solución anterior (aunque imperfecta) que di es la siguiente:

Parece que el widget no está recibiendo "enfoque". Anular su evento de prensa del ratón:

void QSGameBoard::mousePressEvent (QMouseEvent * event){ 
    printf("\nMouse in board"); 
    setFocus(); 
} 

Aquí está el código fuente de un ejemplo de trabajo:

QSGameBoard.h

#ifndef _QSGAMEBOARD_H 
#define _QSGAMEBOARD_H 

#include <QWidget> 
#include <QGraphicsScene> 

class QSGameBoard : public QWidget { 
Q_OBJECT 

public: 
    QSGameBoard(QWidget *p, int w, int h, QGraphicsScene *s); 

signals: 
    void keyCaught(QKeyEvent *e); 

protected: 
    virtual void keyPressEvent(QKeyEvent *event); 
    void mousePressEvent (QMouseEvent * event); 
}; 


#endif /* _QSGAMEBOARD_H */ 

QSGameBoard.cpp

#include <QKeyEvent> 
#include <QLabel> 
#include <QtGui/qgridlayout.h> 
#include <QGridLayout> 

#include "QSGameBoard.h" 


QSGameBoard::QSGameBoard(QWidget* p, int w, int h, QGraphicsScene* s) : 
    QWidget(p){ 

    QLabel* o = new QLabel(tr("Test Test Test")); 
    QGridLayout* g = new QGridLayout(this); 
    g->addWidget(o); 
} 

void QSGameBoard::keyPressEvent(QKeyEvent* event){ 
    printf("\nkey event in board: %i", event->key()); 
} 

void QSGameBoard::mousePressEvent (QMouseEvent * event){ 
    printf("\nMouse in board"); 
    setFocus(); 
} 

main.cpp

#include <QtGui/QApplication> 
#include <QtGui/qmainwindow.h> 

#include "QSGameBoard.h" 

int main(int argc, char *argv[]) { 
    // initialize resources, if needed 
    // Q_INIT_RESOURCE(resfile); 

    QApplication app(argc, argv); 

    QMainWindow oM; 
    QGraphicsScene o; 
    QSGameBoard a(&oM, 1, 2, &o); 
    oM.setCentralWidget(&a); 
    a.show(); 
    oM.show(); 

    // create and show your widgets here 

    return app.exec(); 
} 
+0

Respuesta incorrecta. Las respuestas a continuación (por squid y Vasco Rinaldo) son correctas. – user763305

7

Establezca FocusPolicy en Qt :: ClickFocus para obtener el keybordfocus con el mouse klick. setFocusPolicy (Qt :: ClickFocus);

12

Usted no tiene que volver a implementar mousePressEvent mismo sólo para llamar setFocus. Qt ya lo planeó.

Establezca el FocusPolicy en Qt::ClickFocus para obtener el keybordfocus con el mouse klick.

setFocusPolicy (Qt :: ClickFocus);

Como se ha dicho en el manual:

Esta propiedad se mantiene la forma en el widget acepta el foco del teclado.

La política es Qt :: TabFocus si el widget acepta el enfoque del teclado mediante tabulación, Qt :: ClickFocus si el widget acepta el enfoque haciendo clic, Qt :: StrongFocus si acepta ambos, y Qt :: NoFocus (el predeterminado) si no acepta el foco en absoluto.

Debe habilitar el foco del teclado para un widget si procesa los eventos del teclado. Esto normalmente se hace desde el constructor del widget. Por ejemplo, el constructor QLineEdit llama a setFocusPolicy (Qt :: StrongFocus).

Si el widget tiene un proxy de enfoque, la política de enfoque se propagará a él.