mousepressevent itemsboundingrect c++ qt graphics qgraphicsview

c++ - itemsboundingrect - Cómo panear imágenes en QGraphicsView



qgraphicsscene itemsboundingrect (3)

En caso de que alguien se esté preguntando cómo hacerlo por su cuenta, en realidad es bastante simple. Aquí está el código de mi aplicación:

class ImageView : public QGraphicsView { public: ImageView(QWidget *parent); ~ImageView(); private: virtual void mouseMoveEvent(QMouseEvent *event); virtual void mousePressEvent(QMouseEvent *event); virtual void mouseReleaseEvent(QMouseEvent *event); bool _pan; int _panStartX, _panStartY; };

Debe almacenar la posición de inicio del arrastre, por ejemplo, de esta forma (usé el botón derecho):

void ImageView::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::RightButton) { _pan = true; _panStartX = event->x(); _panStartY = event->y(); setCursor(Qt::ClosedHandCursor); event->accept(); return; } event->ignore(); }

Además, debe borrar la bandera y restaurar el cursor una vez que se suelta el botón:

void ImageView::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::RightButton) { _pan = false; setCursor(Qt::ArrowCursor); event->accept(); return; } event->ignore(); }

Para administrar realmente el arrastre, debe anular el evento de movimiento del mouse. QGraphicsView hereda un QAbstractScrollArea, y sus barras de desplazamiento son fácilmente accesibles. También necesita actualizar la posición panorámica:

void ImageView::mouseMoveEvent(QMouseEvent *event) { if (_pan) { horizontalScrollBar()->setValue(horizontalScrollBar()->value() - (event->x() - _panStartX)); verticalScrollBar()->setValue(verticalScrollBar()->value() - (event->y() - _panStartY)); _panStartX = event->x(); _panStartY = event->y(); event->accept(); return; } event->ignore(); }

Actualmente puedo cargar mi imagen en una escena gráfica y luego otra vez en un QGraphicsViewer.

Soy capaz de implementar una función de zoom al seleccionar un QEvent :: Wheel y luego llamar a la función scale () de graphicsViews.

Sin embargo, parece que no puedo encontrar la manera de hacer funcionar la funcionalidad de bandeja. Básicamente, quiero detectar cuándo un mouse ha hecho clic en la imagen y luego mover la imagen hacia la izquierda, hacia la derecha, hacia arriba o hacia abajo junto con el mouse.

A partir de este momento, básicamente tengo una clase MouseFilter que detecta eventos y hace diferentes cosas según el tipo de evento. Adjunté ese oyente al objeto QGraphicsView


La solución neuviemeporte requiere subclasificar un QGraphicsView.

Se puede obtener otra implementación de arrastre de trabajo sin subclasificar la vista usando eventFilter. Si no necesita personalizar otros comportamientos de QGraphicsView, esta técnica le ahorrará algo de trabajo.

Digamos que su lógica GUI es mantenida por una subclase QMainWindow y QGraphicsView & QGraphicsScene se declaran como miembros privados de esta subclase. Tendrías que implementar la función eventFilter de la siguiente manera:

bool MyMainWindow::eventFilter(QObject *obj, QEvent *event) { if (obj == scene && event->type() == Event::GraphicsSceneMouseMove) { QGraphicsSceneMouseEvent *m = static_cast<QGraphicsSceneMouseEvent*>(event); if (m->buttons() & Qt::MiddleButton) { QPointF delta = m->lastScreenPos() - m->screenPos(); int newX = view->horizontalScrollBar()->value() + delta.x(); int newY = view->verticalScrollBar()->value() + delta.y(); view->horizontalScrollBar()->setValue(newX); view->verticalScrollBar()->setValue(newY); return true; } } return QMainWindow::eventFilter(obj, event); }

Para filtrar eventos de QGraphicsScene, tendrás que instalar MyMainWindow como un filtro de eventos de la escena. Quizás pueda hacer esto en la misma función donde configura su GUI.

void MyMainWindow::setupGUI() { // along with other GUI stuff... scene->installEventFilter(this); }

Puede ampliar esta idea para reemplazar el cursor con la "mano" de arrastre como se muestra anteriormente.


QGraphicsView tiene soporte integrado de desplazamiento del mouse. Establece DragMode correcto y se encargará del resto. Necesitas las barras de desplazamiento habilitadas para que funcione.