2010-04-28 10 views
19

Sto provando da una mezza eternità che ora sovrascrive la chiave di QWidgets. Funzione PressEvent in QT ma semplicemente non funzionerà. Ho dire che sono nuovi al CPP, ma so objC e di serie C.Tasto QWidgetPressEvent override

Il mio problema è simile al seguente:

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 è il mio QWidget sottoclasse e ho bisogno di ignorare il keyPressEvent e fuoco un SEGNALE su ogni evento per notificare alcuni oggetti registrati.

mio keyPressEvent override in QSGameBoard.cpp assomiglia a questo:

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

Quando cambio QSGameBoard :: :: per QWidget riceve gli eventi, ma non posso emettono il segnale perché il compilatore si lamenta la portata . E se lo scrivo in questo modo, la funzione non viene chiamata affatto.

Qual è il problema qui?

+0

Hai accettato la risposta sbagliata. – user763305

risposta

13

MODIFICA: Come sottolineato da altri utenti, il metodo che ho delineato in origine non è il modo corretto per risolvere questo problema. Risposta da Vasco Rinaldo

utilizzare il set di FocusPolicy a Qt :: ClickFocus per ottenere il keybordfocus da Klick mouse. setFocusPolicy (Qt :: ClickFocus);

Il precedente (anche se imperfetta) soluzione che ho dato è il seguente:

Sembra che il tuo widget non è sempre "focus". Ignorare la conferenza stampa del mouse:

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

Ecco il codice sorgente di un esempio di lavoro:

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

Risposta sbagliata. Le risposte qui sotto (di calamaro e Vasco Rinaldo) sono corrette. – user763305

7

Impostare FocusPolicy su Qt :: ClickFocus per ottenere il keybordfocus con il mouse. setFocusPolicy (Qt :: ClickFocus);

12

Non è necessario reimplementare mousePressEvent se stessi solo per chiamare setFocus. Qt l'ha già pianificato.

Impostare FocusPolicy su Qt::ClickFocus per ottenere il keybordfocus con il mouse.

setFocusPolicy (Qt :: ClickFocus);

Come detto nel manuale:

Questa proprietà contiene il modo in cui il widget accetta focus della tastiera.

Il criterio è Qt :: TabFocus se il widget accetta lo stato attivo della tastiera mediante tabulazione, Qt :: ClickFocus se il widget accetta lo stato attivo facendo clic su Qt :: StrongFocus se accetta entrambi e Qt :: NoFocus (predefinito) se non accetta la messa a fuoco.

È necessario abilitare lo stato attivo della tastiera per un widget se elabora eventi di tastiera. Questo è normalmente fatto dal costruttore del widget. Ad esempio, il costruttore di QLineEdit chiama setFocusPolicy (Qt :: StrongFocus).

Se il widget ha un proxy di attivazione, la politica di attivazione verrà propagata ad essa.