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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: (РЕШЕНО) Не помню, есть ли скроллинг сцены при драге айтемов.  (Прочитано 3349 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Март 23, 2015, 01:24 »

Просто не помню, вроде видел где-то, но не могу найти. Когда внутри вьюпорта перемещается курсор с нажатой кнопкой, НО ВАЖНО НЕ таская курсором саму сцену (это и так работает с флагом ScrollHandDrag), а таская айтем (но НЕ QDrag) - вроде было такое, что вьюпорт следует за положением курсора на сцене. То есть, если курсор пытается выехать за край сцены, то вьюпорт перемещается в этом направлении. Но когда кнопка мыши отпущена, то курсор выходит из вьюпорта. Не могу найти - или такого нет, мне в полвторого ночи мерещится, или не могу найти. Кто помнит точно? Надо ли это самому обрабатывать, или достаточно флаг взвести?
« Последнее редактирование: Март 23, 2015, 18:53 от Гурман » Записан

2^7-1 == 127, задумайтесь...
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Март 23, 2015, 08:41 »

Кто помнит точно? Надо ли это самому обрабатывать, или достаточно флаг взвести?
Самому Грустный
Qt-ишники autoScroll сделали только для ItemView, а про GraphicsView забыли Грустный
Записан

Qt 5.11/4.8.7 (X11/Win)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Март 23, 2015, 18:50 »

Ну... не сложно совсем - псевдо-драг производится в перегруженном методе mouseMoveEvent(QGraphicsSceneMouseEvent *event) некоего айтема, который "таскается" по сцене. То есть, если имеется некая точка dragPoint, которая не должна выходить из вьюпорта, то сцене с помощью invokeMethod отправляется через очередь сигнал с координатой этой точки в системе координат сцены.

Код:
    parentScene()->metaObject()->invokeMethod( ms, "ensurePoint", Qt::QueuedConnection, Q_ARG( QPointF, dragPoint ) );

А в самой сцене ловушка сигнала выглядит вот так:

Код:
void MainScene::ensurePoint( QPointF dragPoint )
{
    views().at(0)->ensureVisible( QRectF( dragPoint, QSizeF(1,1) ) );
}

И всё, при приближении точки на 50 пикселов сцены вьюпорт едет в соответствующем направлении.

Но если без очереди вызвать напрямую, то падает, очевидно конфликт циклов обработки событий. Влом детально разбираться, чего с чем.
« Последнее редактирование: Март 23, 2015, 19:24 от Гурман » Записан

2^7-1 == 127, задумайтесь...
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Март 23, 2015, 19:35 »

Только я бы плясал не от сцены, а от вью.
Записан

Qt 5.11/4.8.7 (X11/Win)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #4 : Март 23, 2015, 19:49 »

если вью один единственный (в моём случае иначе и не предвидится), то без разницы где views().at(0) написать
Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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