QGraphicsView von außerhalb verschieben

Alles rund um die Programmierung mit Qt
Antworten
sven-kt
Beiträge: 20
Registriert: 11. Mai 2009 13:07
Wohnort: Franken

QGraphicsView von außerhalb verschieben

Beitrag 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
Qt 4.5, Windows Vista, Kubuntu
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

QGraphicsView::fitInView / centerOn ist nicht das was du suchst?
sven-kt
Beiträge: 20
Registriert: 11. Mai 2009 13:07
Wohnort: Franken

Beitrag 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:
Dateianhänge
viewer.jpg
viewer.jpg (34.13 KiB) 5678 mal betrachtet
Qt 4.5, Windows Vista, Kubuntu
Strahlex
Beiträge: 158
Registriert: 23. Dezember 2008 15:49
Wohnort: Österreich

Beitrag 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));
} 
sven-kt
Beiträge: 20
Registriert: 11. Mai 2009 13:07
Wohnort: Franken

Beitrag 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.
Qt 4.5, Windows Vista, Kubuntu
Strahlex
Beiträge: 158
Registriert: 23. Dezember 2008 15:49
Wohnort: Österreich

Beitrag 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.
sven-kt
Beiträge: 20
Registriert: 11. Mai 2009 13:07
Wohnort: Franken

Beitrag 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.
Qt 4.5, Windows Vista, Kubuntu
Strahlex
Beiträge: 158
Registriert: 23. Dezember 2008 15:49
Wohnort: Österreich

Beitrag von Strahlex »

Dann verschieb nicht über die ScrollBars sondern direkt über setSceneRect().
sven-kt
Beiträge: 20
Registriert: 11. Mai 2009 13:07
Wohnort: Franken

Beitrag von sven-kt »

Also gut, dann geh ich mal von aus, dass es ein C++ Prob ist...
Qt 4.5, Windows Vista, Kubuntu
Antworten