Отслеживание перемещения мыши в классе QGraphicsScene
Я подклассифицировал QGraphicsScene и добавил метод mouseMoveEvent для обработки события перемещения мыши. Я создал линейку поверх GraphicsView и попросил линейку отслеживать движение мыши. В QGraphicsScene:: mousemoveEvent я вызываю mouseMoveEvent виджета линейки explcitely. Цель состоит в том, чтобы знать, что текущая позиция мыши.
Теперь кажется, что QGraphicsScene:: mousemoveEvent не вызывается, когда я перемещаю мышь. Тем не менее, я могу заставить его работать, если я нажму левую кнопку мыши и переместите его, удерживая кнопку. Это не то, что я хотел бы видеть; Я бы хотел, чтобы этот метод вызывался всякий раз, когда я наводил указатель мыши на представление и перемещал мышь.
Есть ли способ обхода?
Ответы
Ответ 1
Как указано в QGraphicsView
, представление отвечает за перевод событий мыши и клавиатуры в события сцены и распространение их на сцена:
Вы можете взаимодействовать с элементами на сцене с помощью мыши и клавиатуры. QGraphicsView переводит мыши и ключевые события в события сцены (события, которые наследуют QGraphicsSceneEvent), и перенаправляет их на визуализированную сцену.
Поскольку события перемещения мыши появляются только при нажатии кнопки по умолчанию, вам необходимо 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