QGraphicsScene: Eventos.

Hay que crear un MyGraphicsScene subclasificado de QGraphicsScene y hay implementar los eventos del ratón y el teclado.

1. Eventos de ratón
1.1 mouseMoveEvent
1.2 mousePressEvent
1.3 mouseReleaseEvent
1.4 La rueda del ratón tiene un tratamiento especial.

2. Eventos del teclado
2.1 keyPressEvent
2.2 keyReleaseEvent

1. Eventos del ratón

1.1 mouseMoveEvent

void MyGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event){
    qDebug() << event->scenePos();
}

1.2. mousePressEvent
void MyGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *event){
switch (event->buttons()) {
case Qt::LeftButton:
qDebug() << "Pulsado el botón izquierdo"; break; case Qt::RightButton: qDebug() << "Pulsado el botón derecho"; break; case Qt::MidButton: qDebug() << "Pulsado el botón central"; default: qDebug() << "Pulsado un botón desconocido" << event->buttons();
break;
}
}
[/c]

1.3. mouseReleaseEvent

void MyGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event){
    qDebug() << "soltado" << event->scenePos();
}

1.4. La rueda del ratón.
Este evento es especial porque se propaga al widget superior. Por defecto al girar la rueda del ratón el QGraphicsView mueve la barra de desplazamiento vertical. Para evitarlo el QGraphicsScene debe aceptar el evento:

event->accept();

La aceptación del evento hay que hacerla en la función eventFilter:

bool MyGraphicsScene::eventFilter(QObject *watched, QEvent *event) {
    if (watched == this && (event->type()==QEvent::GraphicsSceneWheel)) {
        QGraphicsSceneWheelEvent * ew =  static_cast<QGraphicsSceneWheelEvent *>(event);
        qDebug() << "rueda" << ew->delta();
        qDebug() << "---";
        event->accept();
    }
}

Para leer las propiedades de la rueda del ratón hay que convertir el QEvent en QGraphicsSceneWheelEvent:

QGraphicsSceneWheelEvent * ew =  static_cast<QGraphicsSceneWheelEvent *>(event);

2. Los eventos del teclado.

2.1. keyPressEvent

void MyGraphicsScene::keyPressEvent(QKeyEvent *event) {
    qDebug() << "key press" << event->key();
}

2.2. keyReleaseEvent

void MyGraphicsScene::keyReleaseEvent(QKeyEvent *event){
    qDebug() << "key releaded" << event->key();
}

MyGraphicsScene.h

protected:
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
    bool eventFilter(QObject *watched, QEvent *event);
    void keyPressEvent(QKeyEvent *event);
    void keyReleaseEvent(QKeyEvent *event);

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Time limit is exhausted. Please reload CAPTCHA.