qt qgraphicsview qobject qgraphicsscene

qt - Seguimiento del movimiento del mouse en la clase QGraphicsScene



qgraphicsview qobject (2)

He estado preguntando, y en algún lugar encontré algo de información útil, y haciendo pruebas escriba esto

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

Subclasificé QGraphicsScene y agregué el método mouseMoveEvent para manejar el evento de movimiento del mouse. Creé una regla en la parte superior de GraphicsView y tengo el movimiento del mouse de seguimiento de la regla. En el QGraphicsScene :: mousemoveEvent I invoca mouseMoveEvent del widget de regla de forma explícita. El propósito es que la regla sepa que la posición actual del mouse.

Ahora parece que QGraphicsScene :: mousemoveEvent no se llama cuando muevo el mouse. Sin embargo, puedo hacer que funcione si presiono el botón izquierdo del ratón y lo muevo mientras se mantiene presionado el botón. Esto no es lo que me gustaría ver; Me gustaría que se llame a este método cada vez que coloco el mouse sobre la vista y muevo el mouse.

¿Hay algún trabajo alrededor?


Como se indica en la documentación de QGraphicsView , la vista es responsable de traducir los eventos del mouse y del teclado en eventos de la escena y propagarlos a la escena:

Puede interactuar con los elementos de la escena utilizando el mouse y el teclado. QGraphicsView traduce el ratón y los eventos clave en eventos de escena (eventos que heredan QGraphicsSceneEvent,), y los envía a la escena visualizada.

Como los eventos de movimiento del mouse solo se producen cuando se presiona un botón de forma predeterminada, debe setMouseTracking(true) de la setMouseTracking(true) en la vista para que los eventos de movimiento se generen en primer lugar, para que pueda reenviarlos a la escena.
Alternativamente, si no necesita la traducción a las coordenadas de la escena, podría volver a mouseMoveEvent el mouseMoveEvent en la vista directamente en lugar de en su escena. Pero en este caso, asegúrese de llamar a la clase base QGraphicsView::mouseMoveEvent en su implementación, para que los eventos de QGraphicsView::mouseMoveEvent se generen correctamente para los elementos en su escena.