Auf dieser Seite

QCanvasPath Class

QCanvasPath ist das native Pfadformat von QCanvasPainter. Mehr...

Kopfzeile: #include <QCanvasPath>
CMake: find_package(Qt6 REQUIRED COMPONENTS CanvasPainter)
target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter)
Seit: Qt 6.11
Status: Technische Vorschau

Öffentliche Funktionen

QCanvasPath()
QCanvasPath(qsizetype commandsSize, qsizetype commandsDataSize = -1)
QCanvasPath(const QCanvasPath &path)
QCanvasPath(QCanvasPath &&other)
~QCanvasPath()
void addPath(const QCanvasPath &path, const QTransform &transform = QTransform())
void addPath(const QCanvasPath &path, qsizetype start, qsizetype count, const QTransform &transform = QTransform())
void arc(float centerX, float centerY, float radius, float a0, float a1, QCanvasPainter::PathWinding direction = QCanvasPainter::PathWinding::ClockWise, QCanvasPainter::PathConnection connection = QCanvasPainter::PathConnection::Connected)
void arc(QPointF centerPoint, float radius, float a0, float a1, QCanvasPainter::PathWinding direction = QCanvasPainter::PathWinding::ClockWise, QCanvasPainter::PathConnection connection = QCanvasPainter::PathConnection::Connected)
void arcTo(float x1, float y1, float x2, float y2, float radius)
void arcTo(QPointF point1, QPointF point2, float radius)
void beginHoleSubPath()
void beginSolidSubPath()
void bezierCurveTo(float cp1X, float cp1Y, float cp2X, float cp2Y, float x, float y)
void bezierCurveTo(QPointF controlPoint1, QPointF controlPoint2, QPointF endPoint)
void circle(float x, float y, float radius)
void circle(QPointF centerPoint, float radius)
void clear()
void closePath()
qsizetype commandsCapacity() const
qsizetype commandsDataCapacity() const
qsizetype commandsDataSize() const
qsizetype commandsSize() const
QPointF currentPosition() const
void ellipse(float x, float y, float radiusX, float radiusY)
void ellipse(const QRectF &rect)
bool isEmpty() const
void lineTo(QPointF point)
void lineTo(float x, float y)
void moveTo(QPointF point)
void moveTo(float x, float y)
QPointF positionAt(qsizetype index) const
void quadraticCurveTo(float cpX, float cpY, float x, float y)
void quadraticCurveTo(QPointF controlPoint, QPointF endPoint)
void rect(float x, float y, float width, float height)
void rect(const QRectF &rect)
void reserve(qsizetype commandsSize, qsizetype commandsDataSize)
void reserve(qsizetype commandsSize)
void roundRect(float x, float y, float width, float height, float radius)
void roundRect(float x, float y, float width, float height, float radiusTopLeft, float radiusTopRight, float radiusBottomRight, float radiusBottomLeft)
void roundRect(const QRectF &rect, float radius)
void roundRect(const QRectF &rect, float radiusTopLeft, float radiusTopRight, float radiusBottomRight, float radiusBottomLeft)
void setPathWinding(QCanvasPainter::PathWinding winding)
QCanvasPath sliced(qsizetype start, qsizetype count, const QTransform &transform = QTransform()) const
void squeeze()
void swap(QCanvasPath &other)
operator QVariant() const
QCanvasPath &operator=(QCanvasPath &&other)
QCanvasPath &operator=(const QCanvasPath &path)
bool operator!=(const QCanvasPath &lhs, const QCanvasPath &rhs)
bool operator==(const QCanvasPath &lhs, const QCanvasPath &rhs)

Detaillierte Beschreibung

Ein Malpfad ist ein Objekt, das aus einer Reihe von grafischen Bausteinen wie Rechtecken, Ellipsen, Linien und Kurven besteht. QCanvasPath API passt zu QCanvasPainter Pfadmalerei, was es einfach macht, den Code zwischen direkter Malerei und Malerei in einen Pfad anzupassen. Der Hauptgrund für die Verwendung von QCanvasPath ist die Vermeidung der Neuerstellung der (statischen) Pfade und die Möglichkeit, die Pfade in GPU-Puffern zwischenzuspeichern.

Im Vergleich zu QPainterPath ist QCanvasPath mehr für das Rendering optimiert und bietet weniger Funktionen zum Vergleichen oder Anpassen der Pfade. Im Besonderen:

  • Es gibt keine Methoden zur Schnittmenge oder Subtraktion zwischen zwei Pfaden.
  • Es gibt keine Methode zur Übersetzung des Pfades.
  • Es gibt keine Methode zum Hinzufügen von Text.
  • Die Füllregel ist immer WindingFill (ungleich Null), OddEvenFill wird nicht unterstützt.

Von der Funktionalität her ist QCanvasPath dem HTML Canvas Path2D ähnlicher, mit einigen Ergänzungen und der API, die zu QCanvasPainter passt.

PathGroups und Caching

Beim Malen von Pfaden durch QCanvasPath kann die Engine die Pfadgeometrie (Scheitelpunkte) zwischenspeichern. Dies verbessert die Leistung von statischen Pfaden, erhöht aber möglicherweise den GPU-Speicherverbrauch.

Beim Malen von Pfaden mit fill() oder stroke(), die QCanvasPath als Parameter verwenden, ist es möglich, einen pathGroup als zweiten Parameter zu setzen. Damit wird der GPU-Puffer definiert, in dem der Pfad zwischengespeichert wird. Standardmäßig ist pathGroup gleich 0, was bedeutet, dass der erste Puffer verwendet wird. Wird pathGroup auf -1 gesetzt, so bedeutet dies, dass der Pfad keinen eigenen Puffer zuweist und derselbe dynamische Puffer verwendet wird wie beim direkten Malen mit beginPath(), gefolgt von Befehlen und fill/stroke.

Das Anordnen von Pfaden in Pfadgruppen ermöglicht eine effiziente Optimierung der Rendering-Leistung und der GPU-Speicherauslastung. Pfade, die zusammengehören und sich häufig gleichzeitig ändern, sollten für eine optimale Puffernutzung in derselben Gruppe sein.

Wenn sich der Pfad ändert, wird seine Geometrie (Vertex-Puffer) automatisch aktualisiert. Folgende Vorgänge führen zu einer Geometrieaktualisierung der Pfadgruppe:

Beachten Sie, dass eine Änderung der Zustandstransformation (QCanvasPainter::transform(), QCanvasPainter::rotate() usw.) den Pfad nicht ungültig macht, so dass das Verschieben/Skalieren/Drehen eines zwischengespeicherten Pfades sehr effizient ist.

In Fällen, in denen der Pfad nicht mehr gezeichnet werden muss oder die Anwendung GPU-Speicher freigeben sollte, kann der Cache durch den Aufruf von QCanvasPainter::removePathGroup() freigegeben werden. Dies ist in der Regel nicht erforderlich, da die zwischengespeicherten Pfade automatisch während des Destruktors des Malers freigegeben werden.

Siehe auch QCanvasPainter::addPath() und QCanvasPainter::removePathGroup().

Dokumentation der Mitgliedsfunktionen

QCanvasPath::QCanvasPath()

Konstruiert einen leeren Pfad.

[explicit] QCanvasPath::QCanvasPath(qsizetype commandsSize, qsizetype commandsDataSize = -1)

Konstruiert einen leeren Pfad und reserviert Platz für commandsSize Befehle und optional commandsDataSize Daten. Wenn der Parameter commandsDataSize nicht angegeben wird, wird automatisch Platz für die Datenmenge 2 * commandsSize reserviert, was optimal ist, wenn die Pfadbefehle gerade Linien sind (moveTo(), lineTo(), rect()).

Die Reservierung des korrekten Platzes ist eine Optimierung für die Pfaderstellung und die Speichernutzung. Sie ist nicht zwingend erforderlich, da beim Hinzufügen von Befehlen zum Pfad automatisch für ausreichend Platz gesorgt wird.

Siehe auch reserve().

QCanvasPath::QCanvasPath(const QCanvasPath &path)

Konstruiert einen Pfad, der eine Kopie des angegebenen path ist.

QCanvasPath::QCanvasPath(QCanvasPath &&other)

Move-konstruiert einen neuen QCanvasPath aus other.

[noexcept] QCanvasPath::~QCanvasPath()

Zerstört den Pfad.

void QCanvasPath::addPath(const QCanvasPath &path, const QTransform &transform = QTransform())

Fügt path zu diesem Pfad hinzu und verwendet optional transform, um die Pfadpunkte zu ändern. Wenn transform nicht angegeben ist (oder es sich um eine Identitätsmatrix handelt), ist dieser Vorgang sehr schnell, da er die Pfaddaten wiederverwendet.

void QCanvasPath::addPath(const QCanvasPath &path, qsizetype start, qsizetype count, const QTransform &transform = QTransform())

Fügt path in den aktuellen Pfad ein, beginnend mit dem Befehl unter start und einschließlich der Anzahl der Befehle unter count. Optional kann transform verwendet werden, um die Pfadpunkte zu ändern. Der Bereich von start und count wird überprüft, so dass nicht mehr Befehle als QCanvasPath::commandsSize() aufgerufen werden. Falls der Pfad nicht von der aktuellen Pfadposition aus fortgesetzt werden soll, rufen Sie zuerst moveTo() mit path.positionAt(start - 1) auf.

void QCanvasPath::arc(float centerX, float centerY, float radius, float a0, float a1, QCanvasPainter::PathWinding direction = QCanvasPainter::PathWinding::ClockWise, QCanvasPainter::PathConnection connection = QCanvasPainter::PathConnection::Connected)

Erzeugt einen Bogen mit dem Mittelpunkt QPointF(centerX, centerY) und dem angegebenen radius, der mit einem Winkel von a0 im Bogenmaß beginnt und bei a1 im Bogenmaß endet. Der Bogen umspannt die angegebene direction. Wenn connection gleich NotConnected ist, wird der vorherige Pfad geschlossen und ein neuer Unterpfad begonnen.

void QCanvasPath::arc(QPointF centerPoint, float radius, float a0, float a1, QCanvasPainter::PathWinding direction = QCanvasPainter::PathWinding::ClockWise, QCanvasPainter::PathConnection connection = QCanvasPainter::PathConnection::Connected)

Erzeugt einen Bogen, der auf centerPoint zentriert ist, mit dem angegebenen radius, der mit einem Winkel von a0 im Bogenmaß beginnt und bei a1 im Bogenmaß endet. Der Bogen umspannt die angegebene direction. Wenn connection gleich NotConnected ist, wird der vorherige Pfad geschlossen und ein neuer Unterpfad begonnen.

Dies ist eine überladene Funktion.

void QCanvasPath::arcTo(float x1, float y1, float x2, float y2, float radius)

Erzeugt einen Bogen mit den Punkten QPointF(x1, y1) und QPointF(x2, y2) mit dem angegebenen radius.

void QCanvasPath::arcTo(QPointF point1, QPointF point2, float radius)

Erzeugt einen Bogen aus den Punkten point1 und point2 mit dem angegebenen radius.

Dies ist eine überladene Funktion.

void QCanvasPath::beginHoleSubPath()

Starten Sie einen Loch-Unterpfad. Dies ist gleichbedeutend mit setPathWinding(QCanvasPainter::PathWinding::ClockWise))

Siehe auch beginSolidSubPath().

void QCanvasPath::beginSolidSubPath()

Starten Sie einen festen Unterpfad. Dies ist äquivalent zu setPathWinding(QCanvasPainter::PathWinding::CounterClockWise))

Siehe auch beginHoleSubPath().

void QCanvasPath::bezierCurveTo(float cp1X, float cp1Y, float cp2X, float cp2Y, float x, float y)

Fügt eine kubische Bezier-Kurve zwischen der aktuellen Position und dem durch x und y angegebenen Endpunkt hinzu, wobei die durch cp1X, cp1Y, cp2X und cp2Y angegebenen Kontrollpunkte verwendet werden.

Nach dem Hinzufügen der Kurve wird die aktuelle Position so aktualisiert, dass sie sich am Endpunkt der Kurve befindet.

void QCanvasPath::bezierCurveTo(QPointF controlPoint1, QPointF controlPoint2, QPointF endPoint)

Fügt eine kubische Bezier-Kurve zwischen der aktuellen Position und der angegebenen endPoint unter Verwendung der durch controlPoint1 und controlPoint2 angegebenen Kontrollpunkte hinzu.

Nachdem die Kurve hinzugefügt wurde, wird die aktuelle Position so aktualisiert, dass sie sich am Endpunkt der Kurve befindet.

Dies ist eine überladene Funktion.

void QCanvasPath::circle(float x, float y, float radius)

Fügt dem Pfad einen Kreis mit dem Mittelpunkt QPointF(x, y) und dem angegebenen radius hinzu.

void QCanvasPath::circle(QPointF centerPoint, float radius)

Fügt dem Pfad einen Kreis mit dem Mittelpunkt centerPoint und der angegebenen radius hinzu.

Dies ist eine überladene Funktion.

void QCanvasPath::clear()

Löscht die Pfadbefehle und Daten.

Rufen Sie dies auf, wenn sich die Pfadbefehle ändern, um den Pfad neu zu erstellen. Dies hat keinen Einfluss auf die Speichernutzung, verwenden Sie dazu reserve() und squeeze().

Siehe auch reserve() und squeeze().

void QCanvasPath::closePath()

Schließt den aktuellen Teilpfad, indem es eine Linie zum Anfang des Teilpfades zieht und automatisch einen neuen Pfad beginnt.

qsizetype QCanvasPath::commandsCapacity() const

Gibt die Kapazität der Befehle im Pfad zurück.

Siehe auch commandsDataCapacity() und reserve().

qsizetype QCanvasPath::commandsDataCapacity() const

Gibt die Kapazität der Befehlsdaten im Pfad zurück.

Siehe auch commandsCapacity() und reserve().

qsizetype QCanvasPath::commandsDataSize() const

Gibt die Anzahl der Befehlsdaten im Pfad zurück.

Mit Befehlsdaten sind im Wesentlichen die für die Befehle erforderlichen Punkte gemeint.

Hinweis: Einige Pfadelemente erfordern mehrere Datenpunkte. Zum Beispiel erfordert closePath 0 , moveTo und lineTo erfordern 2, bezierCurveTo erfordert 6 und roundRect erfordert 34 Datenpunkte.

qsizetype QCanvasPath::commandsSize() const

Gibt die Anzahl der Befehle im Pfad zurück.

Hinweis: Einige Pfadelemente erfordern mehrere Befehle. Zum Beispiel erfordern moveTo und lineTo den Befehl 1, bezierCurveTo den Befehl 6 und roundRect den Befehl 10.

QPointF QCanvasPath::currentPosition() const

Gibt die aktuelle Position des Pfades zurück. Dies ist die Position, an der der vorherige Pfadbefehl (moveTo, lineTo, bezierCurveTo usw.) endete. Wenn der Pfad leer ist, wird (0.0, 0.0) zurückgegeben.

void QCanvasPath::ellipse(float x, float y, float radiusX, float radiusY)

Erstellt eine Ellipse mit dem Mittelpunkt (x, y), deren Radien durch radiusX, radiusY definiert sind, und fügt sie dem Pfad als geschlossenen Teilpfad hinzu.

void QCanvasPath::ellipse(const QRectF &rect)

Erzeugt eine Ellipse innerhalb des Rechtecks rect und fügt sie dem Pfad als geschlossenen Unterpfad hinzu.

Dies ist eine überladene Funktion.

bool QCanvasPath::isEmpty() const

Gibt true zurück, wenn der Pfad leer ist.

Siehe auch clear.

void QCanvasPath::lineTo(QPointF point)

Fügt eine gerade Linie von der aktuellen Position zur angegebenen point hinzu. Nachdem die Linie gezeichnet wurde, wird die aktuelle Position so aktualisiert, dass sie sich am Endpunkt der Linie befindet.

Dies ist eine überladene Funktion.

void QCanvasPath::lineTo(float x, float y)

Zeichnet eine Linie von der aktuellen Position zu dem Punkt (x, y).

Dies ist eine überladene Funktion.

void QCanvasPath::moveTo(QPointF point)

Verschiebt den aktuellen Punkt zum angegebenen point, wobei implizit ein neuer Unterpfad begonnen und der vorherige geschlossen wird.

Dies ist eine überladene Funktion.

void QCanvasPath::moveTo(float x, float y)

Verschiebt die aktuelle Position nach (x, y) und beginnt einen neuen Unterpfad, wobei der vorherige Pfad implizit geschlossen wird.

Dies ist eine überladene Funktion.

QPointF QCanvasPath::positionAt(qsizetype index) const

Gibt die Position des Pfades bei index zurück. Dies bedeutet, dass der Pfadbefehl (moveTo, lineTo, bezierCurveTo usw.) an der Position index steht. Der Index muss zwischen 0 und commandsSize() - 1 liegen. Wenn der Pfad leer ist, wird (0.0, 0.0) zurückgegeben.

void QCanvasPath::quadraticCurveTo(float cpX, float cpY, float x, float y)

Fügt eine quadratische Bezier-Kurve zwischen dem aktuellen Punkt und dem Endpunkt (x, y) mit dem durch (cpX, cpY) angegebenen Kontrollpunkt hinzu.

void QCanvasPath::quadraticCurveTo(QPointF controlPoint, QPointF endPoint)

Fügt eine quadratische Bezier-Kurve zwischen der aktuellen Position und der angegebenen endPoint mit dem durch controlPoint angegebenen Kontrollpunkt hinzu.

Dies ist eine überladene Funktion.

void QCanvasPath::rect(float x, float y, float width, float height)

Erzeugt ein Rechteck an der Position QPointF(x, y) mit den angegebenen width und height.

void QCanvasPath::rect(const QRectF &rect)

Erzeugt ein Rechteck, das durch rect

Dies ist eine überladene Funktion.

void QCanvasPath::reserve(qsizetype commandsSize, qsizetype commandsDataSize)

Reserviert eine bestimmte Menge an Speicherplatz im internen Speicher von QCanvasPath.

Es wird versucht, Speicher für mindestens commandsSize Befehle und commandsDataSize Datenpunkte zu reservieren. Einige Pfadelemente erfordern mehrere Befehle, siehe commandsSize() und commandsDataSize().

Das Reservieren von korrektem Speicherplatz ist eine Optimierung für die Pfaderstellung und die Speichernutzung. Sie ist nicht zwingend erforderlich, da beim Hinzufügen von Befehlen zum Pfad automatisch für ausreichend Platz gesorgt wird.

Siehe auch squeeze(), commandsCapacity(), und commandsDataCapacity().

void QCanvasPath::reserve(qsizetype commandsSize)

Reserviert eine bestimmte Menge an Speicherplatz im internen Speicher von QCanvasPath.

Versucht, Speicher für mindestens commandsSize Befehle zu reservieren. Einige Pfadelemente erfordern mehrere Befehle, siehe commandsSize() und commandsDataSize().

Es wird automatisch Platz für die Datenmenge von 2 * commandsSize reserviert, die optimal ist, wenn die Pfadbefehle gerade Linien sind (moveTo(), lineTo(), rect()).

Das Reservieren des richtigen Platzes ist eine Optimierung für die Pfaderstellung und die Speichernutzung. Sie ist nicht zwingend erforderlich, da beim Hinzufügen von Befehlen in den Pfad automatisch für ausreichend Platz gesorgt wird.

Dies ist eine überladene Funktion.

Siehe auch squeeze(), commandsCapacity(), und commandsDataCapacity().

void QCanvasPath::roundRect(float x, float y, float width, float height, float radius)

Fügt dem Pfad das angegebene Rechteck x, y, width, height mit abgerundeten Ecken hinzu. Die Ecken sind Viertelkreise mit dem angegebenen radius.

void QCanvasPath::roundRect(float x, float y, float width, float height, float radiusTopLeft, float radiusTopRight, float radiusBottomRight, float radiusBottomLeft)

Fügt dem Pfad das Rechteck x, y, width, height mit abgerundeten Ecken hinzu. Die Ecken sind Viertelkreise mit dem Radius radiusTopLeft, radiusTopRight radiusBottomRight bzw. radiusBottomLeft.

void QCanvasPath::roundRect(const QRectF &rect, float radius)

Fügt dem Pfad das angegebene Rechteck rect mit abgerundeten Ecken hinzu. Die Ecken sind Viertelkreise mit dem angegebenen radius.

Dies ist eine überladene Funktion.

void QCanvasPath::roundRect(const QRectF &rect, float radiusTopLeft, float radiusTopRight, float radiusBottomRight, float radiusBottomLeft)

Fügt dem Pfad das Rechteck rect mit abgerundeten Ecken hinzu. Die Ecken sind Viertelkreise mit den Radien radiusTopLeft, radiusTopRight radiusBottomRight und radiusBottomLeft.

Dies ist eine überladene Funktion.

void QCanvasPath::setPathWinding(QCanvasPainter::PathWinding winding)

Setzt den aktuellen Unterpfad winding entweder auf QCanvasPainter::CounterClockWise (Standard) oder QCanvasPainter::ClockWise. CounterClockWise zeichnet solide Unterpfade, während ClockWise Löcher zeichnet.

Hinweis: Dies ist ein Befehl, ähnlich wie lineTo, moveTo, usw., und daher sollte die Einstellung der Wicklung vor dem Rest der Befehle, auf die die geänderte Wicklung angewendet werden soll, erfolgen.

QCanvasPath QCanvasPath::sliced(qsizetype start, qsizetype count, const QTransform &transform = QTransform()) const

Gibt einen neuen Pfad zurück, der die Befehle aus diesem Pfad enthält, beginnend mit dem Befehl unter start und einschließlich der Anzahl der Befehle unter count, optional unter Verwendung von transform zur Änderung der Pfadpunkte.

Der Bereich von start und count wird überprüft, so dass nicht mehr Befehle als commandsSize() aufgerufen werden. Falls der Befehl bei start nicht MoveTo ist, wird der erste Befehl durch MoveTo ersetzt, so dass dieser Abschnitt ein individueller Pfad ist.

void QCanvasPath::squeeze()

Gibt den Speicher frei, der nicht für die Speicherung der Pfadbefehle und -daten benötigt wird. Dies kann verwendet werden, um den Speicherbedarf nach dem Aufruf von reserve() zu verringern.

Normalerweise ist dies nicht erforderlich, kann aber nützlich sein, wenn die Pfadgröße aufgrund der Reservierung oder des Hinzufügens vieler Elemente (lineTo, bezierCurveTo usw.) groß war und die Größe in Zukunft voraussichtlich viel kleiner sein wird, so dass durch den Aufruf von reserve() und dann squeeze() Speicher freigegeben wird.

Siehe auch reserve().

[noexcept] void QCanvasPath::swap(QCanvasPath &other)

Tauscht diesen Pfad mit other aus. Dieser Vorgang ist sehr schnell und schlägt nie fehl.

QCanvasPath::operator QVariant() const

Gibt den Pfad als QVariant zurück.

[noexcept] QCanvasPath &QCanvasPath::operator=(QCanvasPath &&other)

Verschieben - weist other dieser QCanvasPath Instanz zu.

QCanvasPath &QCanvasPath::operator=(const QCanvasPath &path)

Weist diesem Pfad die angegebene path zu und gibt einen Verweis auf diesen Pfad zurück.

Verwandte Nicht-Mitglieder

[noexcept] bool operator!=(const QCanvasPath &lhs, const QCanvasPath &rhs)

Gibt true zurück, wenn sich der Pfad lhs von rhs unterscheidet; andernfalls false.

Siehe auch operator==().

[noexcept] bool operator==(const QCanvasPath &lhs, const QCanvasPath &rhs)

Gibt true zurück, wenn der Pfad lhs mit rhs übereinstimmt; andernfalls false.

Siehe auch operator!=().

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.