2011-10-14 7 views
17

I sottoclasse QGraphicsScene e aggiunto metodo mouseMoveEvent per gestire l'evento di spostamento del mouse. Ho creato un righello in cima a GraphicsView e ho il righello che tiene traccia del movimento del mouse. Nel QGraphicsScene :: mousemoveEvent I richiama esplicitamente mouseMoveEvent del widget righello. Lo scopo è di avere il righello che conosce la posizione corrente del mouse.Spostamento del mouse di tracciamento in QGraphicsScene classe

Ora sembra che QGraphicsScene :: mousemoveEvent non venga chiamato quando sposto il mouse. Tuttavia, posso farlo funzionare se premo il tasto sinistro del mouse e lo muovo tenendo premuto il pulsante. Questo non è quello che mi piacerebbe vedere; Mi piacerebbe che questo metodo venga chiamato ogni volta che posiziono il mouse sulla vista e muovo il mouse.

C'è qualche soluzione?

+4

OK, scopro . Devo abilitare mouseTracking in QGraphicsView. Dopo averlo fatto funziona come un fascino. – cuteCAT

+4

quindi rispondi alla tua domanda e accetta la risposta – Dmitriy

+0

@SherwoodHu come diceva il geotavros, dovresti rispondere alla tua domanda e accettarla. È una pratica perfettamente valida qui. –

risposta

9

Come indicato nella documentazione QGraphicsView, la vista è responsabile per la traduzione eventi del mouse e della tastiera in eventi di scena e di moltiplicazione che alla scena:

È possibile interagire con gli oggetti sulla scena con il mouse e tastiera. QGraphicsView traduce il mouse e gli eventi chiave in eventi di scena (eventi che ereditano QGraphicsSceneEvent) e li inoltra alla scena visualizzata.

Dal mouse move events si verificano solo quando viene premuto un tasto per impostazione predefinita, è necessario setMouseTracking(true) sulla vista per gli eventi di spostamento per generato in primo luogo, in modo che possa inoltrare quelli alla scena.
In alternativa, se non è necessario tradurre le coordinate di una scena, è possibile reimplementare lo mouseMoveEvent nella vista direttamente anziché nella scena. Ma in questo caso, assicurati di chiamare la classe base QGraphicsView::mouseMoveEvent nella tua implementazione, in modo che gli eventi al passaggio del mouse vengano generati correttamente per gli elementi nella scena.

2

Ho chiesto, e in qualche luogo trovato alcune informazioni utili, e test scritto questo:

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