Есть ли способ программно прервать перетаскивание мышью в Qt?

Я хотел бы сохранить возможность пользователя масштабировать и перетаскивать QGraphicsScene, поэтому я не могу просто заблокировать QGraphicsView. Однако пользователь не должен иметь возможности перетаскивать QGraphicsItem из окна просмотра сцены. Поэтому я ищу способ прервать MouseDragEvent, не игнорируя DragMoveEvent (иначе QGraphicsItem вернуться к исходной точке). Я пытался добиться такого поведения с помощью функции releaseMouse(), но это вообще не сработало. Какие-либо предложения?

Спасибо!


person t0bias    schedule 14.02.2017    source источник
comment
Я не знаю о Qt, но проверьте SetCapture и ClipCursor в Win32 API.   -  person    schedule 14.02.2017
comment
stackoverflow.com/questions/11172420/moving-object-with-mouse может быть, для этой цели переопределить mouseMoveEvent?   -  person Hafnernuss    schedule 14.02.2017
comment
перетащите QGraphicsItem из окна просмотра сцены — QGraphicsItem находится в QGraphicsScene, вы не можете перетащить его из окна просмотра сцены.   -  person TheDarkKnight    schedule 14.02.2017


Ответы (1)


При работе с рамкой представления графической сцены qt и перетаскиванием лучше повторно реализовать QGraphicsItemand::itemChange, чем напрямую работать с мышью.

Это функция, определенная в заголовочном файле:

protected:
virtual QVariant itemChange( GraphicsItemChange change, const QVariant & value );

Затем в функции вы обнаруживаете изменение позиции и возвращаете новую позицию по мере необходимости.

QVariant YourItemItem::itemChange(GraphicsItemChange change, const QVariant & value )
{
     if ( change == ItemPositionChange && scene() ) 
     {
           QPointF newPos = value.toPointF(); // check if this position is out bound

    {
        if ( newPos.x() < xmin) newPos.setX(xmin);
        if ( newPos.x() > xmax ) newPos.setX(xmax);
        if ( newPos.y() < ymin ) newPos.setY(ymin);
        if ( newPos.y() > ymax ) newPos.setY(ymax);
        return newPos;
    }

   ...
}

Что-то вроде этого, вы поняли.

person m. c.    schedule 14.02.2017