En caso de que alguien se pregunte 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;
};
Necesita almacenar la posición inicial de la resistencia, por ejemplo como este (que utiliza el botón de la derecha):
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, es necesario 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 efectivamente el arrastre, es necesario anular el desplazamiento del ratón. QGraphicsView hereda un QAbstractScrollArea, y sus barras de desplazamiento son de fácil acceso. También debe 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();
}
¿Crees que podría implementar esto por mi cuenta? Quiero hacer esto presionando el botón derecho del mouse. ¿Cómo puedo desplazar la vista desde el código? – neuviemeporte
@neuviemeporte: No sé cómo hacerlo con el botón derecho del mouse. Es posible que desee publicarlo como una pregunta separada para que alguien más pueda responderlo. –
Ya no tiene que habilitar las barras de desplazamiento en Qt 5.0 – vsz