2011-10-14 1 views
17

QGraphicsScene을 하위 클래스로 만들고 mouseMoveEvent 메서드를 추가하여 마우스 이동 이벤트를 처리했습니다. 나는 GraphicsView 위에 눈금자를 만들고 눈금자가 마우스 움직임을 추적하도록했습니다. QGraphicsScene :: mousemoveEvent에서 나는 눈금자 위젯의 mouseMoveEvent를 명시 적으로 호출합니다. 눈금자에게 현재 마우스 위치를 알리는 것이 목적입니다.QGraphicsScene 클래스의 마우스 이동

이제 마우스를 움직이면 QGraphicsScene :: mousemoveEvent가 호출되지 않는 것 같습니다. 그러나 마우스 왼쪽 버튼을 누르고 버튼을 누른 상태로 움직이면 움직일 수 있습니다. 이것은 제가보고 싶은 것이 아닙니다. 보기 위에 마우스를 놓고 마우스를 움직일 때마다이 메서드를 호출하고 싶습니다.

해결 방법이 있습니까?

QGraphicsView 문서에 명시된 바와 같이
+4

확인을, 내가 알아 . QGraphicsView에서 mouseTracking을 활성화해야합니다. 그렇게 한 후에 그것은 매력처럼 작동합니다. – cuteCAT

+4

그래서 질문에 답하고 – Dmitriy

+0

@SherwoodHu geotavros가 말했듯이, 당신은 자신의 질문에 답하고 받아 들여야합니다. 여기서는 완벽하게 유효한 연습입니다. –

답변

9

,보기는 현장 이벤트로 마우스와 키보드 이벤트를 번역하고 현장에 그 전파에 대한 책임 :

당신은 마우스를 사용하여 장면의 항목과 상호 작용할 수 있습니다 및 키보드. 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