Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Гурман от Март 23, 2015, 01:24



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


Название: Re: Не помню, есть ли скроллинг сцены при драге айтемов.
Отправлено: GreatSnake от Март 23, 2015, 08:41
Кто помнит точно? Надо ли это самому обрабатывать, или достаточно флаг взвести?
Самому :(
Qt-ишники autoScroll сделали только для ItemView, а про GraphicsView забыли :(


Название: Re: Не помню, есть ли скроллинг сцены при драге айтемов.
Отправлено: Гурман от Март 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 пикселов сцены вьюпорт едет в соответствующем направлении.

Но если без очереди вызвать напрямую, то падает, очевидно конфликт циклов обработки событий. Влом детально разбираться, чего с чем.


Название: Re: (РЕШЕНО) Не помню, есть ли скроллинг сцены при драге айтемов.
Отправлено: GreatSnake от Март 23, 2015, 19:35
Только я бы плясал не от сцены, а от вью.


Название: Re: (РЕШЕНО) Не помню, есть ли скроллинг сцены при драге айтемов.
Отправлено: Гурман от Март 23, 2015, 19:49
если вью один единственный (в моём случае иначе и не предвидится), то без разницы где views().at(0) написать