Standardwerte von QPainter()

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Atalanttore
User
Beiträge: 342
Registriert: Freitag 6. August 2010, 17:03

Samstag 29. Dezember 2018, 17:35

Hallo

Ich habe heute einige Zeit damit verbracht die Herkunft schwarzer Linien in einer `QGraphicsView` zu ergründen. Es liegt anscheinend an der Methode `setPen()`, die standardmäßig um jede geometrische Form eine 1 Pixel breite schwarze Linie zeichnet. In der Doku zur Klasse `QPainter` habe ich lediglich folgende Erklärungen zur Methode `setPen()` gefunden:
Sets the painter's pen to have style Qt::SolidLine, width 1 and the specified color.
Sets the painter's pen to have the given style, width 1 and black color.
In meinem Beispielcode unten wird die Methode `setPen()` nicht aufgerufen, aber trotzdem erscheint eine 1 Pixel breite schwarze Außenlinie am Rechteck.
  1. Warum wird die Methode `setPen()` aufgerufen?
  2. Wo in der Doku erfährt man, welche Werte standardmäßig gelten?

Code: Alles auswählen

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QGraphicsView, QGraphicsScene
from PyQt5.QtGui import QPainterPath


class GraphicsWindow(QGraphicsView):

    def __init__(self, parent=None):
        super(GraphicsWindow, self).__init__(parent)
        scene = QGraphicsScene(self)
        self.setScene(scene)
        scene.setSceneRect(-500, -500, 1000, 1000)
        self.setBackgroundBrush(Qt.white)
        path = QPainterPath()
        path.addRect(100, 100, 200, 200)
        self._path = scene.addPath(path)
        self._path.setBrush(Qt.white)
        #self._path.setPen(Qt.transparent) # Keine Außenlinie


def main():
    app = QApplication(sys.argv)
    graphics_window = GraphicsWindow()
    graphics_window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
Gruß
Atalanttore
__deets__
User
Beiträge: 6401
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 29. Dezember 2018, 19:14

Steht hier: http://doc.qt.io/qt-5/qpen.html

Sind die Werte des default konstruktors.

Warum kümmert sich das so? Setz doch einfach den pen, den du willst.
Atalanttore
User
Beiträge: 342
Registriert: Freitag 6. August 2010, 17:03

Sonntag 30. Dezember 2018, 00:44

Also steht es im Konstruktor des `QPen`-Objekts, das von `QPainter` automatisch erzeugt wird. Nur `setBrush` für eine gleichfarbige geometrische Form reicht also nicht, sondern man muss immer auch über `setPen` die Außenlinie anpassen. Das nächste Mal weiß ich es dann.

Ich wollte nun mittels `setPen` jegliche Linienbildung ganz abschalten, aber `self._path.setPen(Qt.NoPen)` führt nur zu folgendem Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/ata/source/test.py", line 33, in <module>
    main()
  File "/home/ata/source/test.py", line 28, in main
    graphics_window = GraphicsWindow()
  File "/home/ata/source/test.py", line 22, in __init__
    self._path.setPen(Qt.NoPen)
TypeError: setPen(self, Union[QPen, QColor, Qt.GlobalColor, QGradient]): argument 1 has unexpected type 'PenStyle'
Wie macht man das richtig?

Der komplette Code:

Code: Alles auswählen

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QGraphicsView, QGraphicsScene
from PyQt5.QtGui import QPainterPath


class GraphicsWindow(QGraphicsView):

    def __init__(self, parent=None):
        super(GraphicsWindow, self).__init__(parent)
        scene = QGraphicsScene(self)
        self.setScene(scene)
        scene.setSceneRect(-500, -500, 1000, 1000)
        self.setBackgroundBrush(Qt.white)
        path = QPainterPath()
        path.addRect(100, 100, 200, 200)

        self._path = scene.addPath(path)
        self._path.setBrush(Qt.white)

        self._path.setPen(Qt.NoPen) # Funktioniert so nicht
        #self._path.setPen(Qt.transparent) # Keine Außenlinie

def main():
    app = QApplication(sys.argv)
    graphics_window = GraphicsWindow()
    graphics_window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

Gruß
Atalanttore
Benutzeravatar
__blackjack__
User
Beiträge: 4228
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Sonntag 30. Dezember 2018, 02:17

@Atalanttore: In der Fehlermeldung steht ja schon von welchen Typen das Argument für `setPen()` sein darf. Und in der Qt-Dokumentation zum `PenStyle`-Aufzählungstyp steht ein Verweis auf `QPen`, wo man so einen Wert beim Erstellen eines `QPen`-Exemplars übergeben kann. Und `QPen` ist einer der Typen die für das `setPen()`-Argument erlaubt ist. Also ``setPen(QPen(Qt.NoPen))``.
“Give a man a fire and he's warm for a day, but set fire to him and he's warm for the rest of his life.”
— Terry Pratchett, Jingo
Atalanttore
User
Beiträge: 342
Registriert: Freitag 6. August 2010, 17:03

Sonntag 30. Dezember 2018, 02:28

@__blackjack__: Mit der kleinen Änderung funktioniert es nun wie erwartet, wenn man `QPen` importiert hat.

Gruß
Atalanttore
Antworten