2011-10-14 95 views
17

我subclassed QGraphicsScene和添加方法mouseMoveEvent來處理鼠標移動事件。我在GraphicsView的頂部創建了一個標尺,並使標尺跟蹤鼠標移動。在QGraphicsScene :: mousemoveEvent中,我明確地調用了標尺小部件的mouseMoveEvent。目的是讓標尺知道當前的鼠標位置。跟蹤鼠標移動QGraphicsScene類

現在看來,QGraphicsScene :: mousemoveEvent沒有被調用,當我移動鼠標。但是,如果按住鼠標左鍵並按住按鈕移動它,我可以使其工作。這不是我想看到的;我希望每當將鼠標放在視圖上並移動鼠標時調用此方法。

有什麼解決方法嗎?

+4

OK,我發現。我需要在QGraphicsView中啓用mouseTracking。這樣做後,它就像一個魅力。 – cuteCAT

+4

所以回答你的問題並接受答案 – Dmitriy

+0

@SherwoodHu像geotavros說,你應該回答自己的問題並接受它。這是一個非常有效的做法。 – 2012-03-26 18:31:03

回答

9

由於QGraphicsView文檔中陳述,觀點負責將鼠標和鍵盤事件到現場活動和傳播,爲現場:

您可以用鼠標在現場的項目互動和鍵盤。 QGraphicsView將鼠標和鍵盤事件轉換爲場景事件(繼承QGraphicsSceneEvent的事件),並將它們轉發到可視化場景。

由於mouse move events只有當按鈕被按下默認情況下,你需要setMouseTracking(true)上,以在第一時間產生的移動事件的看法,以便它能夠轉發這些現場出現。
或者,如果您不需要翻譯到場景座標,則可以直接在視圖中而不是在場景中重新實現mouseMoveEvent。但在這種情況下,請確保在實現中調用基類QGraphicsView::mouseMoveEvent,以便爲場景中的項目正確生成懸停事件。

2

我一直在問,並在一些地方發現了一些有用的信息,並檢驗這樣寫:

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