Standardwerte von QPainter()

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

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: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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: 407
Registriert: Freitag 6. August 2010, 17:03

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: 14336
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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))``.
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

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

Gruß
Atalanttore
Antworten