2011-10-14 15 views
17

Subclasé QGraphicsScene y agregué el método mouseMoveEvent para manejar el evento de movimiento del mouse. Creé una regla encima de GraphicsView y hago que la regla rastree el movimiento del mouse. En QGraphicsScene :: mousemoveEvent I llama mouseMoveEvent del widget de regla explícitamente. El objetivo es que la regla sepa que la posición actual del mouse.Seguimiento del movimiento del mouse en la clase QGraphicsScene

Ahora parece que QGraphicsScene :: mousemoveEvent no se llama cuando muevo el mouse. Sin embargo, puedo hacer que funcione si presiono el botón izquierdo del mouse y lo muevo manteniendo presionado el botón. Esto no es lo que me gustaría ver; Me gustaría llamar a este método siempre que coloque el mouse sobre la vista y mueva el mouse.

¿Hay alguna solución?

+4

OK, me entero . Necesito habilitar mouseTracking en QGraphicsView. Después de hacerlo, funciona como un encanto. – cuteCAT

+4

para que responda su pregunta y acepte la respuesta – Dmitriy

+0

@SherwoodHu como dijo geotavros, debe responder a su propia pregunta y aceptarla. Es una práctica perfectamente válida aquí. –

Respuesta

9

Como se indica en la documentación QGraphicsView, la vista es responsable de traducir los eventos de ratón y teclado en eventos escena y propagar que a la escena:

Puede interactuar con los elementos de la escena con el ratón y teclado QGraphicsView traduce el mouse y los eventos clave en eventos de escena (eventos que heredan QGraphicsSceneEvent) y los reenvía a la escena visualizada.

Desde mouse move events sólo se producen cuando se pulsa un botón por defecto, es necesario setMouseTracking(true) en la vista de los acontecimientos se mueven a generarse en primer lugar, de modo que pueda enviar los a la escena.
Como alternativa, si no necesita la traducción a coordenadas de escena, puede volver a aplicar el mouseMoveEvent en la vista directamente en lugar de en su escena. Pero en este caso, asegúrese de llamar a la clase base QGraphicsView::mouseMoveEvent en su implementación, para que los eventos de desplazamiento se generen correctamente para los elementos en su escena.

2

me he estado preguntando, y en algún lugar encontré alguna información útil, y las pruebas escribo esto:

tgs.cpp:

#include <QtGui> 
#include "tgs.h" 
#define _alto 300 
#define _ancho 700 
#include <QGraphicsSceneMouseEvent> 

TGs::TGs(QObject *parent) 
    :QGraphicsScene(parent) 
{ // Constructor of Scene 
    this->over = false; 
} 

void TGs::drawBackground(QPainter *painter, const QRectF &rect) 
{ 

#define adjy 30 
#define adjx 30 

    int j = 0; 
    int alto = 0; 

    QPen pen; 
    pen.setWidth(1); 
    pen.setBrush(Qt::lightGray); 
    painter->setPen(pen); 

    painter->drawText(-225, 10, this->str); 
    alto = _alto; // 50 + 2 

    for(int i = 0; i < alto; ++i) 
    { 
     j = i * adjy - 17; 

     painter->drawLine(QPoint(-210, j), QPoint(_ancho, j)); 
    } 

    for(int i = 0; i < 300; ++i) 
    { 
     j = i * adjx - 210; 

     painter->drawLine(QPoint(j, 0), QPoint(j, _ancho * 2)); 
    } 
} 

void TGs::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) 
{ 
    QString string = QString("%1, %2") 
       .arg(mouseEvent->scenePos().x()) 
       .arg(mouseEvent->scenePos().y()); // Update the cursor position text 
    this->str = string; 
    this->update(); 
} 

void TGs::mousePressEvent(QGraphicsSceneMouseEvent *event) 
{ 
    this->update(); 
} 

void TGs::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) 
{ 
    this->update(); 
} 

tgs.h:

#ifndef TGS_H 
#define TGS_H 

#include <QObject> 
#include <QGraphicsView> 
#include <QGraphicsScene> 
#include <QGraphicsTextItem> 

QT_BEGIN_NAMESPACE 

class QGraphicsSceneMouseEvent; 
class QMenu; 
class QPointF; 
class QGraphicsLineItem; 
class QFont; 
class QGraphicsTextItem; 
class QColor; 

QT_END_NAMESPACE 

class TGs : public QGraphicsScene 
{ 
public: 
    TGs(QObject *parent = 0); 

public slots: 
    void drawBackground(QPainter *painter, const QRectF &rect); 
    void mouseMoveEvent(QGraphicsSceneMouseEvent * mouseEvent); 
    void mousePressEvent(QGraphicsSceneMouseEvent *event); 
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); 

    bool over; 
    QString str; 
    QGraphicsTextItem cursor; 
}; 

#endif // TGS_H 
Cuestiones relacionadas