Отслеживание перемещения мыши в классе QGraphicsScene - PullRequest
19 голосов
/ 14 октября 2011

Я вложил в класс QGraphicsScene и добавил метод mouseMoveEvent для обработки события перемещения мыши. Я создал линейку поверх GraphicsView, и у меня есть линейка, отслеживающая движение мыши. В QGraphicsScene :: mousemoveEvent я вызывающе вызываю mouseMoveEvent виджета линейки. Цель состоит в том, чтобы правитель знал текущую позицию мыши.

Теперь кажется, что QGraphicsScene :: mousemoveEvent не вызывается, когда я перемещаю мышь. Тем не менее, я могу заставить его работать, если нажать левую кнопку мыши и переместить ее, удерживая кнопку. Это не то, что я хотел бы видеть; Мне бы хотелось, чтобы этот метод вызывался всякий раз, когда я помещаю мышь над видом и перемещаю мышь.

Есть ли обходной путь?

Ответы [ 2 ]

12 голосов
/ 28 мая 2012

Как указано в документации QGraphicsView, представление отвечает за преобразование событий мыши и клавиатуры в события сцены и распространение их на сцену:

Вы можете взаимодействовать с элементами на сцене с помощью мыши и клавиатуры. QGraphicsView преобразует события мыши и ключа в события сцены (события, которые наследуют QGraphicsSceneEvent) и передает их на визуализированную сцену.

Поскольку события перемещения мыши происходят только при нажатии кнопки по умолчанию, вам необходимо setMouseTracking(true) в представлении для событий перемещения, генерируемых в первую очередь, поэтому что он может отправить их на сцену.
В качестве альтернативы, если вам не требуется перевод в координаты сцены, вы можете переопределить mouseMoveEvent непосредственно в виде, а не в вашей сцене. Но в этом случае убедитесь, что вы вызываете базовый класс QGraphicsView::mouseMoveEvent в своей реализации, чтобы правильно генерировать события наведения для элементов в вашей сцене.

2 голосов
/ 29 марта 2013

Я спрашивал, и в каком-то месте нашел некоторую полезную информацию, а тестирование напишите так:

tgs.cpp * * 1004

#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
...