Russian Qt Forum

Qt => Вопросы новичков => Тема начата: once_again_abc от Декабрь 16, 2013, 09:51



Название: [РЕШЕНО] ScrollHandDrag не работает.
Отправлено: once_again_abc от Декабрь 16, 2013, 09:51
Есть класс, производный от 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);
}


Название: Re: ScrollHandDrag не работает.
Отправлено: GreatSnake от Декабрь 16, 2013, 10:33
Все клавиатурные события системой посылаются в главное окно.
Далее уже само приложение отсылает событие виджету с фокусом.
Так что всё делается правильно.
Если хочешь делать без дополнительного клика, то в глобальном eventFilter() отлавливай нажатие <Space> и в зависимости от положения мыши ищи нужный виджет и сам отсылай ему событие.


Название: Re: ScrollHandDrag не работает.
Отправлено: once_again_abc от Декабрь 16, 2013, 12:45
Какое событие мне нужно отсылать дочернему QGraphicsView? И почему рандомно прерывается перетаскивание? Получается, что мой QGraphicsView виджет во время перетаскивания вдруг теряет фокус ввода... что это за глюк? Версия Qt 4.6.2.