Seite 1 von 1

Zoom-Funktion in QWidget

Verfasst: Montag 16. April 2018, 15:42
von Patrick1990
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.

Re: Zoom-Funktion in QWidget

Verfasst: Montag 16. April 2018, 16:29
von __deets__
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.

Re: Zoom-Funktion in QWidget

Verfasst: Montag 16. April 2018, 16:36
von Patrick1990
Habe ich gerade auch gelesen, jedoch scheint es nicht so einfach zu sein Linien nach Punkten zu Zeichnen oder? Beispielsweise Kreissegmente usw.

Re: Zoom-Funktion in QWidget

Verfasst: Montag 16. April 2018, 16:54
von __deets__

Re: Zoom-Funktion in QWidget

Verfasst: Dienstag 17. April 2018, 14:09
von Patrick1990
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?

Re: Zoom-Funktion in QWidget

Verfasst: Dienstag 17. April 2018, 16:45
von Patrick1990
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

Re: Zoom-Funktion in QWidget

Verfasst: Donnerstag 24. Mai 2018, 16:58
von Patrick1990
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.