Zoom-Funktion in QWidget

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Patrick1990
User
Beiträge: 67
Registriert: Freitag 3. Juni 2016, 05:45

Montag 16. April 2018, 15:42

Hallo,

ich habe ein Programm, welches mit QPainter in ein QWidget zeichnet (Beispielsweise ein Kreis).
Gibt es eine Möglichkeit den Inhalt des QWidget-Fensters zu zoomen um Details sichtbar zu machen?

Vielen Dank.
__deets__
User
Beiträge: 3289
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 16. April 2018, 16:29

Wenn du mit QGraphicsView arbeitest, dann kannst du sehr einfach eine affine Transformation deiner Inhalte machen, die zB alles was danach kommt zoomt/rotiert/skaliert.

Das ist alles in der Dokumentation zu QGraphicsView beschrieben.
Patrick1990
User
Beiträge: 67
Registriert: Freitag 3. Juni 2016, 05:45

Montag 16. April 2018, 16:36

Habe ich gerade auch gelesen, jedoch scheint es nicht so einfach zu sein Linien nach Punkten zu Zeichnen oder? Beispielsweise Kreissegmente usw.
Patrick1990
User
Beiträge: 67
Registriert: Freitag 3. Juni 2016, 05:45

Dienstag 17. April 2018, 14:09

Danke, habe heute ein paar Versuche angestellt.
Ein Problem habe ich.

Ich habe ein Fenster QGraphicsView und darin ein QGraphicsScene, in dem eine Linie gezeichnet wird.
Nun will ich das so skalieren, dass die Linie immer auf das Fenster des QGraphicsView angepasst wird.

Durch scale klappt das zu Beginn ganz gut, jedoch bei Änderung der Fenstergröße und dem resize Event nicht mehr.
Gibt es evtl. eine einfache Lösung um die Scene immer auf das Fenster zu skalieren?
Patrick1990
User
Beiträge: 67
Registriert: Freitag 3. Juni 2016, 05:45

Dienstag 17. April 2018, 16:45

Ok, auch dieses Problem ist soweit gelöst.
Eine Sache ist jedoch offen:

Ich möchte mit Hilfe des wheel-Events zoomen.
Das funktioniert soweit recht gut, beim Herauszoomen jedoch wird zuerst immer an den unteren Rand meine Grafik gescrollt, bevor herausgezoomt wird.
Scheinbar ist das schon einigen aufgefallen, aber eine Lösung konnte ich nicht finden.
Der Befehl

Code: Alles auswählen

ScrollBarAlwaysOff
blendet hier scheinbar nur die ScrollBar aus, deaktiviert diese jedoch nicht, sodass erst nach unten gescrollt wird, bevor meine Funktion zu herauszoomen aktiv wird.

Code: Alles auswählen

def wheelEvent(self, event):
    if event.angleDelta().y() > 0:
        factor = 1.1
        self.zoom += 1
    else:
        factor = 0.9
        self.zoom -= 1
    if self.zoom > 0:
        self.graphicsView.scale(factor, factor)
    elif self.zoom == 0:
        self.graphicsView.fitInView(self.scene.sceneRect())
    else:
        self.zoom = 0
Patrick1990
User
Beiträge: 67
Registriert: Freitag 3. Juni 2016, 05:45

Donnerstag 24. Mai 2018, 16:58

Habe das Problem noch immer nicht lösen können.
Bin im Internet auf folgendes gestoßen:

Code: Alles auswählen

void FooBar::resizeEvent(QResizeEvent *) {
        fitView();
}

void FooBar::showEvent(QShowEvent *) {
        fitView();
}

void FooBar::fitView() {
        const QRectF rect = QRectF(-0.5,-0.5, 1, 1);
        ui->graphicsView->fitInView(rect,
                                    Qt::KeepAspectRatio);
        ui->graphicsView->setSceneRect(rect);
}
Dieser Code, übersetzt in Python, deaktiviert die Scrollbar-Funktion.
Leider ist es dabei so, dass folgendes keine Wirkung mehr besitzt:

Code: Alles auswählen

QGraphicsView.setDragMode(QGraphicsView.ScrollHandDrag)
QGraphicsView.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
QGraphicsView.setResizeAnchor(QGraphicsView.AnchorUnderMouse)


Habt ihr noch eine andere Idee?


Hier der Link zum Code:
https://stackoverflow.com/questions/468 ... ng/4689738


Wenn gewünscht, kann ich einmal Beispielcode hochladen.
Antworten