Russian Qt Forum
Ноябрь 26, 2024, 17:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] ScrollHandDrag не работает.  (Прочитано 2217 раз)
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);
}
« Последнее редактирование: Декабрь 17, 2013, 06:31 от once_again_abc » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Декабрь 16, 2013, 10:33 »

Все клавиатурные события системой посылаются в главное окно.
Далее уже само приложение отсылает событие виджету с фокусом.
Так что всё делается правильно.
Если хочешь делать без дополнительного клика, то в глобальном eventFilter() отлавливай нажатие <Space> и в зависимости от положения мыши ищи нужный виджет и сам отсылай ему событие.
Записан

Qt 5.11/4.8.7 (X11/Win)
once_again_abc
Гость
« Ответ #2 : Декабрь 16, 2013, 12:45 »

Какое событие мне нужно отсылать дочернему QGraphicsView? И почему рандомно прерывается перетаскивание? Получается, что мой QGraphicsView виджет во время перетаскивания вдруг теряет фокус ввода... что это за глюк? Версия Qt 4.6.2.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.056 секунд. Запросов: 22.