Verschieben eines QPixmap um die Ecke eine QGraphicsScene
Ich habe einen QGraphicsView und QGraphicsScene so verbunden:
graphicsScene->setSceneRect(this->graphicsView->rect());
graphicsView->setScene(this->Scene);
Dann lade ich ein Bild und fügen Sie es zu der Szene:
QPixmap pixmap;
pixmap.load(fileName);
pixmap = pixmap.scaled(this->graphicsView->size());
QGraphicsPixmapItem* item = this->Scene->addPixmap(pixmap);
Nun, wie in der Dokumentation beschrieben, die Bild-Ecke bei (0,0), das ist nicht die Ecke des graphicsScene. Ich weiß, ich kann die position der resultierenden pixmap by doing:
item->setPos(this->Scene->sceneRect().x(), this->Scene->sceneRect().y());
Aber ich kann nicht scheinen, um Sinn der Koordinaten des rect ' s der Szene oder der Ansicht. Kann mir jemand erklären, wie ich die pixmap in die Ecke des scene/view?
Dank,
David
EDIT: Hier ist die vollständige form-Konstruktor. Die QGraphicsView wurde im Qt-Designer und ist in ein GridLayout-Objekt:
Form::Form(QWidget *parent)
: QWidget(parent)
{
setupUi(this);
QGraphicsScene* scene = new QGraphicsScene;
scene->setSceneRect(this->graphicsView->rect());
this->graphicsView->setScene(scene);
QPixmap pixmap;
pixmap.load("image.png");
pixmap = pixmap.scaled(this->graphicsView->size());
scene->addPixmap(pixmap);
}
Ich auch so probiert:
QGraphicsScene* scene = new QGraphicsScene;
this->graphicsView->setScene(scene);
QPixmap pixmap;
pixmap.load("/home/doriad/glasses.jpg");
QGraphicsPixmapItem * item = scene->addPixmap(pixmap);
this->graphicsView->fitInView (item);
aber erscheint das Bild winzig, anstatt Auffüllen der Sicht wie ich es erwarten würde. Kann das jemand erklären?
Den vollständigen Projekt-und Bild gibt es hier: daviddoria.com/Uploads/qt/QPixmapPosition
- Sind Sie interessiert an der Ecke der Szene, oder in die Ecke der Ansicht, unabhängig davon, wo kann es sein positioniert?
- Ich möchte nur eine Szene, in der Ansicht, also idealerweise würde ich gerne die Ecke der Szene, um eine Linie mit der Ecke des anzeigen - dann die Ecke der pixmap konnte line-up und es wäre das gleiche.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mach dir keine sorgen über die Skalierung der pixmap sich selbst oder auch zu übersetzen, lassen Sie die Ansicht, es für Sie tun.
Verwenden
graphicsView->fitInView(pixmap);
aber Sie sollten Lesen Sie dazu die Dokumentation :Qt Graphics View Framework
void QGraphicsView::setSceneRect (QRectF )
void QGraphicsView::translate ( qreal dx, qreal dy )
void QGraphicsView::fitInView ( const QGraphicsItem * Einzelteil -, ... )
Den Weg, die QGraphicsScene und QGraphicsView interagieren, ist, dass Sie können eine einzelne Szene, in der mindestens eine oder mehrere Ansichten.
Ein gutes Beispiel, ich mag zu denken, ist ein vergrößerter Ausschnitt einer Karte mit einer mini-Ansicht der gesamten Karte in der Ecke. Es gibt zwei Ansichten, ein Teil der Karte und einer die gesamte Karte mit einer Szene, die Karte selbst.
So stellen Sie Objekte in Ihrer Szene, und alle Objekte in der Szene gezogen werden, die relative Größe zueinander. Die "Szene " rect" Ihrer Ansicht standardmäßig skaliert die Elemente in der Ansicht, bis Sie eine Einheit in der Szene, ist ein pixel in der Ansicht oder bis braucht es, um zu verkleinern, um alle passen die Objekte in Ihrer Szene.
Wenn Sie anrufen fitInView(someItem) es sollte das skalieren der Ansicht der Szene, so dass das Element angegeben, füllt es auf und übersetzt Sie die Ansicht so, dass es zentriert ist. Wenn Sie brauchen, um zu übersetzen oder skalieren Sie es mehr verwenden, die
translate
oderscale
Funktionen in QGraphicsView.Wenn Sie springen zwischen den Koordinatensystemen der Szene und Darstellung, QRect oder QPoint ist, verwenden Sie die helper-Funktionen:
mapToScene
undmapFromScene
von QGraphicsView.Versuchen Sie dies:
Standardmäßig die pixmap wird bei (0,0) in der Szene, und die Szene wird bei (0,0) in der Ansicht. QWidgets sind in der Größe durch Pixel. Wenn Sie hatte einen QGraphicsView die Größe des Bildschirms und die Auflösung ist 1440 x 900, können Sie die position der Objekte in der Ansicht von (0,0) oder der oberen linken Ecke des Bildschirms, um (1440,900) wird in der unteren rechten Ecke des Bildschirms. Die meisten QGraphicsItems platziert werden, mit Referenz auf Ihren linken oberen Ecke. So platzieren eine pixmap auf (0,0) richtet die Obere linke Ecke der pixmap mit der linken oberen Ecke der Szene ist es platziert. Wenn Ihr pixmap - 'hängt an der Unterseite Ihrer Sicht, versuchen Sie es mit:
Wenn Sie die Funktion:
Den graphicsView nur einen Bildlauf zu dem Punkt, wo Sie Ihre Artikel passt in die Ansicht.
Ich heruntergeladen David ' s code und lief es zwei Möglichkeiten. Klicken Sie auf die links, um die Ergebnisse zu sehen.
1) mit pixmap=pixmap.scaledToHeight(this->graphicsView->Höhe());
2) mit pixmap=pixmap.scaledToHeight(200);
Ich weiß nicht genug, um zu erklären, warum dies geschieht, aber ich dachte, es wäre eine hilfreiche Daten zeigen.
Es stellt sich heraus, das problem war, dass die GraphicsView war in ein layout. In meinem Beispiel, die Größe der das Bild gemacht wurde in die Formular-Konstruktor. Anscheinend ist dies vor dem layout nimmt seine Form? Zog ich den code auf eine Drucktaste und wenn ich es auf dem Bild ist Größe, wie ich es erwarten würde.
Bekam ich die Bild zu bleiben, die Größe der GraphicsView in das Layout durch das erstellen von Unterklassen QGraphicsView und reimplementing :
Dann Verbinde ich dies geändert () - signal an einen slot, der ruft einfach
this->View->fitInView (this->ImageToTraceItem);
David
#include <QShowEvent>
und implementierenvoid showEvent(QShowEvent*){ this->View->fitInView(this->ImageToTraceItem);}