Standardwerte von QPainter()

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Atalanttore
User
Beiträge: 341
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: 6197
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: 341
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: 4014
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))``.
“Programmieren ist ein Hobby, bei dem es einen riesigen Baumarkt mit quasi jedem Bauteil und Werkzeug und fast immer kostenlos gibt. Ob man deswegen in der Lage ist einen Kölner Dom zu bauen ist eine andere Frage. Arbeit steckt auf jeden Fall drin ;).” — Greebo, forum.ubuntuusers.de
Atalanttore
User
Beiträge: 341
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