QGraphicsView von außerhalb verschieben
QGraphicsView von außerhalb verschieben
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
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
Qt 4.5, Windows Vista, Kubuntu
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:
Und zwar fehlen mir öfters, aufgrund von Rundungsdifferenzen, ein paar Pixel bis an den Rand:
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()));
}
- Dateianhänge
-
- viewer.jpg (34.13 KiB) 5674 mal betrachtet
Qt 4.5, Windows Vista, Kubuntu
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));
}
Genau aus diesem Grund sollst du auch immer die qreals als virtuelle Position mitlaufen lassen, dann solltest du keine Rundungsfehler mehr haben.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.