Есть класс, производный от QGraphicsView, отображающий QGraphicsScene с несколькими QGraphicsPixmapItem-с. Хочется таскать сцену с айтемами как обычно это делается в любых приложениях со скролл барами.
в конструкторе наследника QGraphicsView делаю это:
setAlignment(Qt::AlignCenter);
setScene(&m_scene);
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
setMouseTracking( true );
QWidget::setCursor( Qt::ArrowCursor );
setFocusPolicy( Qt::StrongFocus );
setContextMenuPolicy( Qt::CustomContextMenu );
setResizeAnchor(AnchorViewCenter);
setTransformationAnchor(AnchorUnderMouse);
setRenderHint(QPainter::Antialiasing, true);
setFrameStyle(QFrame::NoFrame);
переопределяю keyPressEvent и keyReleaseEvent
void ImageWidget::keyPressEvent( QKeyEvent * event )
{
QGraphicsView::keyPressEvent( event );
if( event && event->key() == Qt::Key_Space )
{
m_bSpaceKeyOn = true;
}
}
void ImageWidget::keyReleaseEvent( QKeyEvent * event )
{
QGraphicsView::keyReleaseEvent( event );
if( event && event->key() == Qt::Key_Space )
{
m_bSpaceKeyOn = false;
}
}
в mouseMoveEvent ничего не делаю, надеюсь что QGraphicsView сам все сделает:
void ImageWidget::mouseMoveEvent( QMouseEvent *event )
{
QGraphicsView::mouseMoveEvent(event);
}
в результате, чтобы сделать небольшой drag мне нужно сперва кликнуть внутри viewport-a. получается такая последовательность: кликнул левой клавишей мыши внутри вьюпорта, нажал пробел (по пробелу хочу перетаскивать), чуть-чуть передвинул сцену и т.д. При этом куча событий с номером 129 сыпятся родителю в event обработчик.
Что я делаю не так или что я не так понял?!
П.С.: проблема была в неправильных обработчиках mouse press/release. Вот правильная версия:
void ImageWidget::mousePressEvent( QMouseEvent *event )
{
if( m_bSpaceKeyOn )
{
setDragMode( QGraphicsView::ScrollHandDrag );
}
QGraphicsView::mousePressEvent(event);
}
void ImageWidget::mouseReleaseEvent( QMouseEvent * event )
{
setDragMode( QGraphicsView::NoDrag ); // clean up flag
QGraphicsView::mouseReleaseEvent(event);
}