2017-02-14 2 views
0

Ich möchte die Fähigkeit eines Benutzers zum Zoomen und Ziehen einer QGraphicsScene beibehalten, so kann ich nicht einfach die QGraphicsView sperren. Ein Benutzer sollte jedoch keinen QGraphicsItem aus dem Szenen-Ansichtsfenster ziehen können. Daher suche ich nach einer Möglichkeit, ein MouseDragEvent zu unterbrechen, ohne das DragMoveEvent zu ignorieren (aka lassen den QGraphicsItem zurück zu seinem Ursprungspunkt springen). Ich habe versucht, dieses Verhalten mit der releaseMouse() -Funktion zu erreichen, aber das hat überhaupt nicht funktioniert. Irgendwelche Vorschläge?Gibt es eine Möglichkeit, eine Maus, die programmgesteuert in Qt gezogen wird, zu unterbrechen?

Danke!

+0

Ich weiß nicht über Qt, aber überprüfen Sie SetCapture und ClipCursor in der Win32-API. –

+0

http://stackoverflow.com/questions/11172420/moving-object-with-mouse vielleicht überschreiben mouseMoveEvent für diesen Zweck? – Hafnernuss

+0

* Ziehen Sie ein QGraphicsItem aus dem Szenen-Ansichtsfenster * - Ein QGraphicsItem befindet sich in einer QGraphicsScene, Sie können es nicht aus dem Ansichtsfenster der Szene ziehen. – TheDarkKnight

Antwort

1

Wenn es um den Umgang mit qt-Grafikszenensichtrahmen geht und das Ziehen ist, ist es besser, QGraphicsItemand :: itemChange erneut zu implementieren als mit der Maus direkt zu arbeiten.

Dies ist die Funktion in Header-Datei definiert:

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

Dann in der Funktion geben Sie die Positionsänderung zu erkennen und die neue Position zurückkehren, wie gebraucht.

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

    ... 
} 

So etwas, Sie bekommen die Idee.

Verwandte Themen