2017-02-14 16 views
0

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

Спасибо!

+0

Я не знаю о Qt, но проверьте SetCapture и ClipCursor в Win32 API. –

+0

http://stackoverflow.com/questions/11172420/moving-object-with-mouse Может быть, переопределить mouseMoveEvent для этой цели? – Hafnernuss

+0

* перетащить QGraphicsItem из области просмотра с экрана * - QGraphicsItem живет в QGraphicsScene, вы не можете вытащить его из окна просмотра сцены. – TheDarkKnight

ответ

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; 
    } 

    ... 
} 

Что-то вроде этого, вы получаете эту идею.