Seite 1 von 1
QGraphicsView von außerhalb verschieben
Verfasst: 17. August 2009 13:27
von sven-kt
Hallo,
ich habe eine große QGraphicsView und eine kleine QGraphicsView.
Wenn ich nun in die große hineinzoome, wird mir in der kleinen mit Hilfe eines QGraphicsRectItem der Zoomausschnitt des Ganzen angezeigt,
also ich habe in der kleinen eine Kopie der Grafik und je weiter ich hineinzoome, umso kleiner wird mein Rechteck.
Wenn ich jetzt mein Rechteck (abgeleitet von QGraphicsRectItem und QObject wegen Signal/Slot) verschiebe,
dann verschiebe ich gleichzeitig die Scrollbars der großen View über das Delta aktuelle Position, letzte Position (QGraphicsSceneMouseEvent).
Das Problem dabei ist, dass es zu Ungenauigkeiten auf Grund von Rundungen kommt(Position double, ScrollBars int).
Ich konnte die View schon akkurat mit dem kleinen Rechteck verschieben, jedoch mit item->setPos, nur leider bleiben da die Scrollbars da wo sie sind.
Hat jemand einen Rat wie ich die Rundungen umgehen kann?
Gruß
sven
Verfasst: 17. August 2009 16:15
von upsala
QGraphicsView::fitInView / centerOn ist nicht das was du suchst?
Verfasst: 18. August 2009 09:49
von sven-kt
Ich glaube nicht..
Meine kleine QGraphicsView sollte dann im Prinzip ähnlich funktionieren, wie der Navigator in Photoshop.
Momentan 'funktioniert' es so eher schlecht als recht:
Code: Alles auswählen
void MyGraphicsRectItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
QGraphicsItem::mouseMoveEvent(event);
QPointF dScenePos;
dScenePos.setX(event->scenePos().x() - event->lastScenePos().x());
dScenePos.setY(event->scenePos().y() - event->lastScenePos().y());
emit myGraphicsViewTranslation(dScenePos);
}
void imageviewer::translateMyGraphicsView(QPointF dScenePos)
{
QScrollBar *myHBar = ktGraphicsView->horizontalScrollBar();
QScrollBar *myVBar = ktGraphicsView->verticalScrollBar();
myHBar->setValue(qRound(myHBar->value() + dScenePos.x() * ui->zoomBox->value()));
myVBar->setValue(qRound(myVBar->value() + dScenePos.y() * ui->zoomBox->value()));
}
Und zwar fehlen mir öfters, aufgrund von Rundungsdifferenzen, ein paar Pixel bis an den Rand:
Verfasst: 18. August 2009 13:49
von Strahlex
Lass nebenbei noch 2 qreals mit der aktuellen Position mitlaufen:
Code: Alles auswählen
qreal currentX,
currentY;
void MyGraphicsRectItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
QGraphicsItem::mouseMoveEvent(event);
QPointF dScenePos;
dScenePos.setX(event->scenePos().x() - event->lastScenePos().x());
dScenePos.setY(event->scenePos().y() - event->lastScenePos().y());
emit myGraphicsViewTranslation(dScenePos);
}
void imageviewer::translateMyGraphicsView(QPointF dScenePos)
{
QScrollBar *myHBar = ktGraphicsView->horizontalScrollBar();
QScrollBar *myVBar = ktGraphicsView->verticalScrollBar();
currentY = currentY + dScenePos.x() * ui->zoomBox->value());
currentX = currentX + dScenePos.y() * ui->zoomBox->value());
myVBar->setValue(qRound(currentY));
myHBar->setValue(qRound(currentX));
}
Verfasst: 18. August 2009 14:55
von sven-kt
und welche Position?
myHBar->value() liefert sie doch, ist aber immer integer
..wenn ich das Delta von event->screenPos und event->lastScreenPos nehme,
bekomme ich zwar einen QPoint mit integer Werten zurück, aber durch den Zoomfaktor muss ich trotzdem wieder runden.
Verfasst: 18. August 2009 16:08
von Strahlex
sven-kt hat geschrieben:
..wenn ich das Delta von event->screenPos und event->lastScreenPos nehme,
bekomme ich zwar einen QPoint mit integer Werten zurück, aber durch den Zoomfaktor muss ich trotzdem wieder runden.
Genau aus diesem Grund sollst du auch immer die qreals als virtuelle Position mitlaufen lassen, dann solltest du keine Rundungsfehler mehr haben.
Verfasst: 18. August 2009 16:42
von sven-kt
Ich glaube das ist nicht ganz das was ich suche.
Wie du selbst schreibst:
myVBar->setValue(qRound(currentY));
müsste ich am Ende doch wieder runden, und ich such eine Lösung, die ganz ohne qRound oder Typenkonvertierung auskommt.
Verfasst: 18. August 2009 18:56
von Strahlex
Dann verschieb nicht über die ScrollBars sondern direkt über setSceneRect().
Verfasst: 19. August 2009 09:08
von sven-kt
Also gut, dann geh ich mal von aus, dass es ein C++ Prob ist...