Sur cette page

QCanvasPainter Class

La classe QCanvasPainter effectue une peinture accélérée par le matériel sur QRhi. Plus...

En-tête : #include <QCanvasPainter>
CMake : find_package(Qt6 REQUIRED COMPONENTS CanvasPainter)
target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter)
Depuis : Qt 6.11
Statut : Aperçu technique

Types publics

enum class CompositeOperation { SourceOver, SourceAtop, DestinationOut }
enum class ImageFlag { GenerateMipmaps, RepeatX, RepeatY, Repeat, FlipY, …, NativeTexture }
flags ImageFlags
enum class LineCap { Butt, Round, Square }
enum class LineJoin { Round, Bevel, Miter }
enum class PathConnection { NotConnected, Connected }
enum class PathWinding { CounterClockWise, ClockWise }
enum class RenderHint { Antialiasing, HighQualityStroking, DisableWindingEnforce }
flags RenderHints
enum class TextAlign { Left, Right, Center, Start, End }
enum class TextBaseline { Top, Hanging, Middle, Alphabetic, Bottom }
enum class TextDirection { LeftToRight, RightToLeft, Inherit, Auto }
enum class WrapMode { NoWrap, Wrap, WordWrap, WrapAnywhere }

Fonctions publiques

QCanvasPainter()
~QCanvasPainter()
qsizetype activeImageCount() const
qsizetype activeImageMemoryUsage() const
QCanvasImage addImage(const QImage &image, QCanvasPainter::ImageFlags flags = {})
QCanvasImage addImage(QRhiTexture *texture, QCanvasPainter::ImageFlags flags = {})
QCanvasImage addImage(const QCanvasOffscreenCanvas &canvas, QCanvasPainter::ImageFlags flags = {})
void addPath(const QPainterPath &path)
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 = PathWinding::ClockWise, QCanvasPainter::PathConnection connection = PathConnection::Connected)
void arc(QPointF centerPoint, float radius, float a0, float a1, QCanvasPainter::PathWinding direction = PathWinding::ClockWise, QCanvasPainter::PathConnection connection = PathConnection::Connected)
void arcTo(float x1, float y1, float x2, float y2, float radius)
void arcTo(QPointF controlPoint1, QPointF controlPoint2, float radius)
void beginHoleSubPath()
void beginPath()
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 centerX, float centerY, float radius)
void circle(QPointF centerPoint, float radius)
void cleanupResources()
void clearRect(float x, float y, float width, float height)
void clearRect(const QRectF &rect)
void closePath()
QCanvasOffscreenCanvas createCanvas(QSize pixelSize, int sampleCount = 1, QCanvasOffscreenCanvas::Flags flags = {})
void destroyCanvas(QCanvasOffscreenCanvas &canvas)
float devicePixelRatio() const
void drawBoxShadow(const QCanvasBoxShadow &shadow)
void drawImage(const QCanvasImage &image, float x, float y)
void drawImage(const QCanvasImage &image, const QRectF &destinationRect)
void drawImage(const QCanvasImage &image, const QRectF &sourceRect, const QRectF &destinationRect)
void drawImage(const QCanvasImage &image, float x, float y, float width, float height)
void ellipse(float centerX, float centerY, float radiusX, float radiusY)
void ellipse(const QRectF &rect)
void ellipse(QPointF centerPoint, float radiusX, float radiusY)
void fill()
void fill(const QCanvasPath &path, int pathGroup = 0)
void fillRect(float x, float y, float width, float height)
void fillRect(const QRectF &rect)
void fillText(const QString &text, float x, float y, float maxWidth = -1)
void fillText(const QString &text, const QRectF &rect)
void fillText(const QString &text, QPointF point, float maxWidth = -1)
QTransform getTransform() const
void lineTo(float x, float y)
void lineTo(QPointF point)
void moveTo(float x, float y)
void moveTo(QPointF point)
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 removeImage(const QCanvasImage &image)
void removePathGroup(int pathGroup)
QCanvasPainter::RenderHints renderHints() const
void reset()
void resetClipping()
void resetTransform()
void restore()
void rotate(float angle)
void roundRect(float x, float y, float width, float height, float radius)
void roundRect(const QRectF &rect, float radius)
void roundRect(const QRectF &rect, float radiusTopLeft, float radiusTopRight, float radiusBottomRight, float radiusBottomLeft)
void roundRect(float x, float y, float width, float height, float radiusTopLeft, float radiusTopRight, float radiusBottomRight, float radiusBottomLeft)
void save()
void scale(float scale)
void scale(float scaleX, float scaleY)
void setAntialias(float antialias)
void setBrushTransform(const QTransform &transform)
void setClipRect(float x, float y, float width, float height)
void setClipRect(const QRectF &rect)
void setFillStyle(const QColor &color)
void setFillStyle(const QCanvasBrush &brush)
void setFont(const QFont &font)
void setGlobalAlpha(float alpha)
void setGlobalBrightness(float value)
void setGlobalCompositeOperation(QCanvasPainter::CompositeOperation operation)
void setGlobalContrast(float value)
void setGlobalSaturate(float value)
void setLineCap(QCanvasPainter::LineCap cap)
void setLineJoin(QCanvasPainter::LineJoin join)
void setLineWidth(float width)
void setMiterLimit(float limit)
void setPathWinding(QCanvasPainter::PathWinding winding)
void setRenderHint(QCanvasPainter::RenderHint hint, bool on = true)
void setRenderHints(QCanvasPainter::RenderHints hints, bool on = true)
void setStrokeStyle(const QColor &color)
void setStrokeStyle(const QCanvasBrush &brush)
void setTextAlign(QCanvasPainter::TextAlign align)
void setTextAntialias(float antialias)
void setTextBaseline(QCanvasPainter::TextBaseline baseline)
void setTextDirection(QCanvasPainter::TextDirection direction)
void setTextLineHeight(float height)
void setTextWrapMode(QCanvasPainter::WrapMode wrapMode)
void setTransform(const QTransform &transform)
void skew(float angleX, float angleY = 0.0f)
void stroke()
void stroke(const QCanvasPath &path, int pathGroup = 0)
void strokeRect(float x, float y, float width, float height)
void strokeRect(const QRectF &rect)
QRectF textBoundingBox(const QString &text, float x, float y, float maxWidth = -1)
QRectF textBoundingBox(const QString &text, const QRectF &rect)
QRectF textBoundingBox(const QString &text, QPointF point, float maxWidth = -1)
void transform(const QTransform &transform)
void translate(float x, float y)
void translate(QPointF point)

Membres publics statiques

float mmToPx(float mm)
float ptToPx(float pt)

Description détaillée

Qt Canvas Painter (QCanvasPainter) fournit une API de peinture optimisée pour la peinture accélérée par le matériel (GPU). L'API suit de près la spécification HTML Canvas 2D Context, portée à Qt C++. Elle est également influencée par QPainter, mais avec une API plus compacte.

Voici un exemple simple d'utilisation de QCanvasPainter pour créer un bouton rond.

QRectF rect(40, 70, 120, 60);
QRectF shadowRect = rect.translated(2, 4);
// Paint shadow
QCanvasBoxShadow shadow(shadowRect, 30, 15, "#60373F26");
p->drawBoxShadow(shadow);
// Paint rounded rect
p->beginPath();
p->roundRect(rect, 30);
p->setFillStyle("#DBEB00");
p->fill();
// Paint text
p->setTextAlign(QCanvasPainter::TextAlign::Center);
p->setTextBaseline(QCanvasPainter::TextBaseline::Middle);
QFont font("Titillium Web", 18);
p->setFont(font);
p->setFillStyle("#373F26");
p->fillText("CLICK!", rect);

Voici un autre exemple de peinture d'un graphique simple.

// Paint grid
QCanvasGridPattern grid(0, 0, 10, 10, "#404040", "#202020");
p->setFillStyle(grid);
p->fillRect(0, 0, width(), height());
// Paint axis
p->setFillStyle(QColorConstants::White);
p->fillRect(0, 0.5 * height() - 1, width(), 2);
p->fillRect(0.5 * width() - 1, 0, 2, height());
// Paint shadowed graph
p->beginPath();
p->moveTo(20, height() * 0.8);
p->bezierCurveTo(width() * 0.2, height() * 0.4,
                 width() * 0.5, height() * 0.8,
                 width() - 20, height() * 0.2);
p->setAntialias(10);
p->setLineWidth(12);
p->setStrokeStyle("#D0000000");
p->stroke();
p->setAntialias(1);
p->setLineWidth(6);
QCanvasLinearGradient lg(0, 0, 0, height());
lg.setStartColor(QColorConstants::Red);
lg.setEndColor(QColorConstants::Green);
p->setStrokeStyle(lg);
p->stroke();

Caractéristiques

Pour l'essentiel et du point de vue du nommage, QCanvasPainter suit de près le HTML Canvas 2D Context (https://html.spec.whatwg.org/multipage/canvas.html#2dcontext). Cela rend l'API familière à de nombreux développeurs, et permet de réutiliser facilement le code Canvas existant. Mais l'objectif n'est PAS d'être 100% compatible avec le HTML Canvas. QCanvasPainter manque de certaines fonctionnalités pour le rendre plus simple, plus performant sur QRhi hardware accelerated graphics API, et pour mieux cibler les besoins modernes de l'interface utilisateur. Pour ces raisons, QCanvasPainter possède également des fonctionnalités supplémentaires par rapport à HTML Canvas 2D Context.

Voici quelques unes des fonctionnalités qui nous manquent actuellement par rapport à HTML Canvas :

  • Découpage : Tous les détourages sont des rectangles (transformés) et le détourage des formes de chemin n'est pas supporté.
  • Mode de remplissage : Seul le mode de remplissage par défaut Non-zero est supporté, pas de support pour le mode de remplissage Even-odd.
  • Tirets : Les traits sont toujours des lignes pleines, les motifs de traits en pointillés ne sont pas pris en charge.
  • Test de chemin : Il n'existe pas de méthodes isPointInPath() ou isPointInStroke().
  • Trait de texte : Pas de prise en charge du tracé des contours du texte.
  • Filtre : Les effets de filtre SVG de Canvas ne sont pas pris en charge.
  • CompositeModes : Le nombre de modes composites est limité à 3, ce qui peut être pris en charge sans que le rendu ne soit effectué dans des tampons supplémentaires.
  • Ombres : Les méthodes d'ombrage intégrées ne sont pas prises en charge.

D'un autre côté, QCanvasPainter offre des fonctionnalités supplémentaires par rapport à HTML canvas :

  • Groupes de chemins : QCanvasPainter permet de peindre sur des chemins statiques et de mettre en cache ces chemins en tant que groupes pour une utilisation optimale du GPU.
  • Anti-crénelage ajustable : Grâce à l'anticrénelage des vertex du chemin et au rendu de texte SDF, la quantité d'anticrénelage en pixels peut être librement ajustée pour une peinture plus lisse.
  • Dégradé de boîte : En plus des gradients linéaires, radiaux et coniques, QCanvasPainter supporte également le gradient de boîte de rectangle arrondi.
  • Ombre de la boîte : QCanvasPainter supporte également les brosses de type CSS box-shadow. Le rendu utilise une approche SDF similaire à Qt Quick RectangularShadow , ce qui le rend très performant.
  • Motifs de grille : QCanvasPainter supporte QCanvasGridPattern pour les styles de grilles et de barres dynamiques.
  • Brosses personnalisées : QCanvasPainter permet également le remplissage et le traçage avec des vertex et des fragment shaders personnalisés (QCanvasCustomBrush). Ces brosses personnalisées peuvent également être utilisées pour le texte.
  • Enveloppe du texte : QCanvasPainter supporte l'habillage automatique du texte en plusieurs lignes, avec différents modes d'habillage.
  • Effets de couleur : En plus de globalAlpha, QCanvasPainter supporte également la luminosité, le contraste et la saturation globaux.
  • Images teintées : QCanvasPainter ajoute le support des couleurs de teinte pour les images peintes et les motifs d'image.

QCanvasPainter est agnostique, et utilisable pour les applications Qt Quick et Qt Widgets. En fait, il est utilisable même sans l'une ou l'autre de ces applications, avec seulement QWindow et QRhi. Pour utiliser QCanvasPainter, utilisez-le à partir d'une de ces classes, en fonction de l'architecture de votre application :

Règles d'enroulement

QCanvasPainter utilise la règle de remplissage nonzero (WindingFill). Pour sélectionner le remplissage en fonction de la direction des points du chemin, désactivez le forçage de l'enroulement en définissant DisableWindingEnforce rendering hint avec setRenderHint().

p->setRenderHint(QCanvasPainter::RenderHint::DisableWindingEnforce);
p->beginPath();
// Outer shape, counterclockwise
p->moveTo(20, 20);
p->lineTo(100, 180);
p->lineTo(180, 20);
p->closePath();
// Inner shape, clockwise
p->moveTo(100, 40);
p->lineTo(125, 90);
p->lineTo(75, 90);
p->closePath();
p->fill();
p->stroke();

Toutefois, il est plus courant de s'appuyer sur le forçage de l'enroulement et de définir l'enroulement préféré à l'aide des aides setPathWinding() ou beginHoleSubPath() et beginSolidSubPath().

p->beginPath();
p->roundRect(20, 20, 160, 160, 30);
// Start painting holes
p->beginHoleSubPath();
p->roundRect(40, 40, 120, 120, 10);
// Start painting solid
p->beginSolidSubPath();
p->rect(60, 60, 80, 20);
p->circle(100, 120, 20);
p->fill();
p->stroke();

Documentation sur les types de membres

enum class QCanvasPainter::CompositeOperation

Qt Canvas Painter prend en charge 3 opérations composites :

ConstanteValeurDescription de la valeur
QCanvasPainter::CompositeOperation::SourceOver0Valeur par défaut. Dessine de nouvelles formes au-dessus du contenu existant.
QCanvasPainter::CompositeOperation::SourceAtop1La nouvelle forme n'est dessinée qu'à l'endroit où elle chevauche le contenu existant.
QCanvasPainter::CompositeOperation::DestinationOut2Le contenu existant est conservé lorsqu'il ne se superpose pas à la nouvelle forme.

Voir aussi setGlobalCompositeOperation().

enum class QCanvasPainter::ImageFlag
flags QCanvasPainter::ImageFlags

Cette enum spécifie les drapeaux relatifs aux images. A utiliser avec addImage() pour définir les drapeaux.

ConstanteValeurDescription
QCanvasPainter::ImageFlag::GenerateMipmaps1 << 0Définir cette option pour générer des mipmaps pour l'image. Les mipmaps doivent être utilisés lorsqu'une sortie plus lisse est souhaitée pour les images qui sont mises à l'échelle à une taille inférieure à la taille d'origine.
QCanvasPainter::ImageFlag::RepeatX1 << 1Utiliser avec le motif de l'image pour répéter l'image en coordonnées X.
QCanvasPainter::ImageFlag::RepeatY1 << 2Utiliser avec le motif de l'image pour répéter l'image en coordonnées Y.
QCanvasPainter::ImageFlag::RepeatRepeatX | RepeatYUtiliser avec le motif de l'image pour répéter l'image dans les deux coordonnées.
QCanvasPainter::ImageFlag::FlipY1 << 3Retourne (inverse) l'image dans la direction Y lors du rendu.
QCanvasPainter::ImageFlag::Premultiplied1 << 4Les données de l'image ont un alpha prémultiplié.
QCanvasPainter::ImageFlag::Nearest1 << 5L'interpolation de l'image est la plus proche au lieu d'être linéaire.
QCanvasPainter::ImageFlag::NativeTexture1 << 6Signifie qu'il s'agit d'une texture en dehors de QCanvasPainter.

Le type ImageFlags est un typedef pour QFlags<ImageFlag>. Il stocke une combinaison OU de valeurs ImageFlag.

enum class QCanvasPainter::LineCap

LineCap est utilisé pour définir comment la fin de la ligne (cap) est dessinée.

ConstanteValeurDescription
QCanvasPainter::LineCap::Butt0(par défaut) Fin de ligne carrée qui ne couvre pas le point final de la ligne.
QCanvasPainter::LineCap::Round1Fin de ligne ronde.
QCanvasPainter::LineCap::Square2Fin de ligne carrée qui couvre le point final et le dépasse de la moitié de la largeur de la ligne.

Voir également setLineCap().

enum class QCanvasPainter::LineJoin

LineJoin est utilisé pour définir la manière dont sont dessinées les jonctions entre deux lignes connectées.

ConstanteValeurDescription
QCanvasPainter::LineJoin::Round0L'arc de cercle entre les deux lignes est rempli.
QCanvasPainter::LineJoin::Bevel1L'encoche triangulaire entre les deux lignes est remplie.
QCanvasPainter::LineJoin::Miter2(par défaut) Les bords extérieurs des lignes sont prolongés pour former un angle et cette zone est remplie.

Voir également setLineJoin() et setMiterLimit().

enum class QCanvasPainter::PathConnection

Avec certaines méthodes de dessin, PathConnection est utilisé pour spécifier si le nouveau chemin doit être connecté au dernier point du chemin précédent.

ConstanteValeurDescription
QCanvasPainter::PathConnection::NotConnected0Aucune ligne n'est tracée entre le dernier point du chemin précédent et le premier point du chemin actuel.
QCanvasPainter::PathConnection::Connected1Le dernier point de la trajectoire précédente sera relié au premier point de la trajectoire actuelle.

Voir également arc().

enum class QCanvasPainter::PathWinding

PathWinding est utilisé pour spécifier la direction du tracé du chemin. Cette direction est utilisée pour déterminer si un sous-chemin est plein ou troué dans le chemin.

ConstanteValeurDescription
QCanvasPainter::PathWinding::CounterClockWise0(par défaut) Sens inverse des aiguilles d'une montre pour les formes solides.
QCanvasPainter::PathWinding::ClockWise1Sens des aiguilles d'une montre pour les trous.

Voir aussi setPathWinding().

enum class QCanvasPainter::RenderHint
flags QCanvasPainter::RenderHints

Cette enum spécifie des drapeaux à QCanvasPainter relatifs au rendu. Utilisez setRenderHint() pour définir les drapeaux.

ConstanteValeurDescription
QCanvasPainter::RenderHint::Antialiasing1 << 0La valeur false désactive l'anticrénelage. L'activation de l'anticrénelage entraîne un coût de rendu plus élevé. La valeur par défaut est true.
QCanvasPainter::RenderHint::HighQualityStroking1 << 1La valeur "true" permet d'obtenir un rendu plus correct dans certains cas moins courants où les traits se chevauchent et n'ont pas une opacité totale. L'activation de cette option entraîne un coût de rendu plus élevé. La valeur par défaut est false.
QCanvasPainter::RenderHint::DisableWindingEnforce1 << 2La valeur true désactive l'application de l'enroulement du chemin pour qu'il corresponde à ce qui a été défini dans setPathWinding(). La désactivation permet par exemple de créer des trous dans les chemins en ajoutant les points dans l'ordre des horloges. La désactivation peut également améliorer les performances.

Le type RenderHints est un typedef pour QFlags<RenderHint>. Il stocke une combinaison OU de valeurs RenderHint.

enum class QCanvasPainter::TextAlign

TextAlign est utilisé pour définir l'alignement horizontal du texte.

ConstanteValeurDescription
QCanvasPainter::TextAlign::Left0Aligne le côté gauche du texte horizontalement sur la position spécifiée.
QCanvasPainter::TextAlign::Right1Aligne le côté droit du texte horizontalement sur la position spécifiée.
QCanvasPainter::TextAlign::Center2Aligne le centre du texte horizontalement sur la position spécifiée.
QCanvasPainter::TextAlign::Start3(par défaut) Le texte est aligné au début normal de la ligne (aligné à gauche pour les locales de gauche à droite, aligné à droite pour les locales de droite à gauche).
QCanvasPainter::TextAlign::End4Le texte est aligné à la fin normale de la ligne (aligné à droite pour les locales de gauche à droite, aligné à gauche pour les locales de droite à gauche).

Voir aussi setTextAlign(), setTextDirection() et fillText().

enum class QCanvasPainter::TextBaseline

TextBaseline est utilisé pour définir l'alignement vertical du texte.

ConstanteValeurDescription
QCanvasPainter::TextBaseline::Top0Aligne le haut du texte verticalement sur la position spécifiée.
QCanvasPainter::TextBaseline::Hanging1Aligne la ligne de base suspendue du texte verticalement sur la position spécifiée.
QCanvasPainter::TextBaseline::Middle2Aligne le milieu du texte verticalement sur la position spécifiée.
QCanvasPainter::TextBaseline::Alphabetic3(par défaut) Aligne la ligne de base du texte verticalement sur la position spécifiée.
QCanvasPainter::TextBaseline::Bottom4Aligne le bas du texte verticalement sur la position spécifiée.

Voir également setTextBaseline() et fillText().

enum class QCanvasPainter::TextDirection

TextDirection permet de définir l'alignement horizontal du texte.

ConstanteValeurDescription
QCanvasPainter::TextDirection::LeftToRight0Le texte est aligné de gauche à droite.
QCanvasPainter::TextDirection::RightToLeft1La direction du texte est de droite à gauche.
QCanvasPainter::TextDirection::Inherit2(par défaut) La direction du texte est héritée de QGuiApplication layoutDirection. Voir https://doc.qt.io/qt-6/qguiapplication.html#layoutDirection-prop.
QCanvasPainter::TextDirection::Auto3La direction du texte est détectée automatiquement à partir de la chaîne de texte. Voir QString::isRightToLeft().

Remarque : comme cette option nécessite l'analyse du texte, elle est potentiellement plus lente que les autres options.

Voir aussi setTextDirection(), setTextAlign(), et fillText().

enum class QCanvasPainter::WrapMode

WrapMode est utilisé pour définir comment le texte est enveloppé sur plusieurs lignes.

ConstanteValeurDescription
QCanvasPainter::WrapMode::NoWrap0(par défaut) Aucun habillage n'est effectué. Si le texte ne contient pas suffisamment de nouvelles lignes, la largeur du contenu (contentWidth) dépassera la largeur définie.
QCanvasPainter::WrapMode::Wrap1Si possible, l'habillage se fait à la limite d'un mot ; sinon, il se fait à l'endroit approprié sur la ligne, même au milieu d'un mot.
QCanvasPainter::WrapMode::WordWrap2L'habillage ne se fait qu'à la limite des mots. Si un mot est trop long, la largeur du contenu dépassera la largeur fixée.
QCanvasPainter::WrapMode::WrapAnywhere3L'habillage se fait à n'importe quel point de la ligne, même s'il se produit au milieu d'un mot.

Voir aussi setTextWrapMode() et fillText().

Documentation des fonctions membres

QCanvasPainter::QCanvasPainter()

Construit un peintre.

[noexcept] QCanvasPainter::~QCanvasPainter()

Détruit le peintre.

qsizetype QCanvasPainter::activeImageCount() const

Renvoie le nombre d'objets QCanvasImage actifs enregistrés sur ce site QCanvasPainter. Cela inclut également les images créées en interne pour gradients.

QCanvasImage Les objets créés par l'enregistrement d'instances QCanvasOffscreenCanvas ou de textures gérées en externe ne sont pas pris en compte par cette fonction.

Voir aussi activeImageMemoryUsage(), addImage() et removeImage().

qsizetype QCanvasPainter::activeImageMemoryUsage() const

Renvoie une approximation en kilo-octets de la mémoire utilisée par les données d'image (pixels) pour toutes les instances actives de QCanvasImage pour ce peintre qui ont été créées par la surcharge addImage() en prenant un QImage. Cela inclut également les données des images créées en interne pour gradients.

QCanvasPainter La fonction QImage ne conserve pas de copies des données côté CPU une fois que addImage() a été retourné. Par conséquent, le résultat de cette fonction est une approximation de la mémoire du GPU utilisée pour les textures.

Note : La valeur est seulement une estimation basée sur le format et les dimensions de l'image. Qt ne sait pas comment les données des textures sont stockées et disposées dans la mémoire du GPU.

Les toiles hors écran et les textures gérées en externe et enregistrées via les autres surcharges addImage() ne sont pas prises en compte par cette fonction.

Pour chaque QCanvasImage valide, la taille individuelle en octets peut toujours être demandée en appelant sizeInBytes(). Cette fonction renvoie également des résultats valides lorsque QCanvasImage a été créé à partir d'un QCanvasOffscreenCanvas ou d'un QRhiTexture, mais elle ne prend pas en compte les données mipmap ou multisample.

Voir également activeImageCount(), addImage() et removeImage().

QCanvasImage QCanvasPainter::addImage(const QImage &image, QCanvasPainter::ImageFlags flags = {})

Ajoute image avec flags disponible pour le peintre en tant que texture. Retourne QCanvasImage avec l'identifiant de la texture et d'autres informations sur l'image. L'image retournée QCanvasImage peut être utilisée avec drawImage et QCanvasImagePattern. Après l'appel de cette méthode, image QImage n'a pas besoin d'être conservé en mémoire.

L'appel à la même image est une opération peu coûteuse, puisqu'on s'attend à une réponse du cache.

Lors de l'optimisation, il faut veiller à n'appeler addImage() qu'une seule fois. Cela n'est pas toujours suffisant, en fonction de la conception de l'application. Par exemple, si les ressources graphiques sous-jacentes sont perdues, par exemple parce que le peintre est associé à un nouveau QRhi sous le capot en raison du déplacement d'un widget vers un nouveau niveau supérieur, l'appel à cette fonction est essentiel pour recréer les textures graphiques natives à partir de image.

Voir également drawImage() et removeImage().

QCanvasImage QCanvasPainter::addImage(QRhiTexture *texture, QCanvasPainter::ImageFlags flags = {})

Ajoute texture avec flags disponible pour le peintre en tant que texture. L'indicateur NativeTexture est défini implicitement. Le fichier QCanvasImage retourné peut être utilisé avec drawImage et QCanvasImagePattern.

Note : La propriété de texture n' est pas prise.

Il s'agit d'une fonction surchargée.

Voir aussi drawImage() et removeImage().

QCanvasImage QCanvasPainter::addImage(const QCanvasOffscreenCanvas &canvas, QCanvasPainter::ImageFlags flags = {})

Enregistre canvas avec flags auprès du peintre afin qu'il soit disponible en tant qu'image. L'image QCanvasImage renvoyée peut être utilisée avec drawImage et QCanvasImagePattern.

Remarque : canvas continue à gérer les ressources graphiques natives sous-jacentes, ce qui signifie que removeImage() ne rend pas canvas invalide.

Il s'agit d'une fonction surchargée.

Voir également drawImage() et removeImage().

void QCanvasPainter::addPath(const QPainterPath &path)

Ajoute path au chemin actuel.

Remarque : QCanvasPainter utilise la règle de remplissage WindingFill (non nulle), ce qui signifie que tous les chemins QPainterPaths ne sont pas rendus correctement. C'est le cas par exemple lorsque le chemin contient des caractères de texte avec des trous.

Remarque : cette méthode est disponible principalement pour des raisons de compatibilité avec QPainter et QPainterPath. Elle n'améliore pas les performances par rapport à la peinture du chemin directement avec les méthodes de QCanvasPainter.

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

Ajoute path au chemin actuel, en utilisant éventuellement transform pour modifier les points du chemin. Lorsque transform n'est pas fourni (ou qu'il s'agit d'une matrice d'identité), cette opération est très rapide car elle réutilise les données du chemin.

// m_path is QCanvasPath
if (m_path.isEmpty())
    m_path.circle(60, 60, 40);
p->beginPath();
p->addPath(m_path);
p->addPath(m_path, QTransform::fromTranslate(80, 80));
p->fill();
p->stroke();

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

Ajoute path au chemin actuel, en commençant par la commande start et en incluant le nombre de commandes count. Il est possible d'utiliser transform pour modifier les points du chemin. La plage de start et count est vérifiée, de sorte que les commandes ne sont pas accédées plus que QCanvasPath::commandsSize(). Si le chemin ne doit pas continuer à partir de la position actuelle du chemin, appeler d'abord moveTo(), par exemple avec path.positionAt(start - 1).

// m_path is QCanvasPath
if (m_path.isEmpty()) {
    m_path.moveTo(20, 60);
    for (int i = 1; i < 160; i++) {
        m_path.lineTo(20 + i,
                      60 + 20 * sin(0.1 * i));
    }
}
p->stroke(m_path);
p->beginPath();
p->addPath(m_path, 20, 100,
           QTransform::fromTranslate(0, 80));
p->stroke();

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

Crée un nouveau sous-chemin en forme d'arc de cercle. Le centre de l'arc est situé à centerX, centerY, avec radius, et l'arc est dessiné de l'angle a0 à a1, et balayé à direction (ClockWise ou CounterClockWise). Lorsque connection est NotConnected, l'arc n'ajoute pas de ligne entre la position du chemin précédent et le début de l'arc. Les angles sont spécifiés en radians.

p->beginPath();
p->moveTo(100, 100);
p->arc(100, 100, 80, 0, 1.5 * M_PI);
p->closePath();
p->fill();
p->stroke();

Remarque : alors que le contexte HTML canvas 2D utilise arc() pour peindre des cercles, il est recommandé d'utiliser circle() ou ellipse() avec QCanvasPainter.

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

Crée un nouveau sous-chemin en forme d'arc de cercle. Le centre de l'arc est situé à centerPoint, avec radius, et l'arc est dessiné de l'angle a0 à a1, et balayé à direction (ClockWise ou CounterClockWise). Lorsque connection est NotConnected, l'arc n'ajoute pas de ligne entre la position du chemin précédent et le début de l'arc. Les angles sont spécifiés en radians.

Remarque : alors que le contexte HTML canvas 2D utilise arc() pour peindre des cercles, il est recommandé d'utiliser circle() ou ellipse() avec QCanvasPainter.

Il s'agit d'une fonction surchargée.

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

Ajoute un segment d'arc au coin défini par le dernier point du chemin et deux points spécifiés (x1, y1 et x2, y2) avec radius. L'arc est automatiquement relié au dernier point du chemin par une ligne droite si nécessaire.

p->beginPath();
p->moveTo(20, 20);
p->arcTo(240, 20, 20, 220, 50);
p->arcTo(20, 220, 20, 20, 30);
p->stroke();

void QCanvasPainter::arcTo(QPointF controlPoint1, QPointF controlPoint2, float radius)

Ajoute un segment d'arc au coin défini par le dernier point du chemin et deux points spécifiés (controlPoint1 et controlPoint2) avec radius. L'arc est automatiquement relié au dernier point du chemin par une ligne droite si nécessaire.

Il s'agit d'une fonction surchargée.

void QCanvasPainter::beginHoleSubPath()

Commencer un sous-chemin de trou. Ceci est équivalent à setPathWinding(QCanvasPainter::PathWinding::ClockWise))

p->beginPath();
p->circle(100, 100, 80);
p->beginHoleSubPath();
p->rect(60, 60, 80, 80);
p->beginSolidSubPath();
p->circle(100, 100, 20);
p->fill();
p->stroke();

Voir aussi beginSolidSubPath().

void QCanvasPainter::beginPath()

Commence à dessiner une nouvelle trajectoire tout en effaçant la trajectoire actuelle.

void QCanvasPainter::beginSolidSubPath()

Commencer un sous-chemin solide. Ceci est équivalent à setPathWinding(QCanvasPainter::PathWinding::CounterClockWise))

Voir aussi beginHoleSubPath().

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

Ajoute un segment de bézier cubique à partir du dernier point de la trajectoire via deux points de contrôle (cp1X, cp1Y et cp2X, cp2Y) jusqu'au point spécifié (x, y).

p->beginPath();
p->moveTo(20, 20);
p->bezierCurveTo(150, 50, 50, 250, 180, 120);
p->stroke();

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

Ajoute un segment de bézier cubique à partir du dernier point de la trajectoire via deux points de contrôle (controlPoint1 et controlPoint2) jusqu'au point spécifié endPoint.

Il s'agit d'une fonction surchargée.

void QCanvasPainter::circle(float centerX, float centerY, float radius)

Crée un nouveau sous-chemin en forme de cercle dans ( centerX, centerY) avec radius.

p->beginPath();
p->circle(100, 100, 80);
p->fill();
p->stroke();

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

Crée un nouveau sous-chemin en forme de cercle dans centerPoint avec radius.

Il s'agit d'une fonction surchargée.

void QCanvasPainter::cleanupResources()

Planifie l'élimination des textures inutilisées du cache.

En outre, d'autres caches et pools peuvent être réduits lors de l'appel de cette fonction, afin de minimiser l'utilisation de la mémoire. Cela peut potentiellement conduire à des appels de dessin plus coûteux par la suite.

void QCanvasPainter::clearRect(float x, float y, float width, float height)

Efface les pixels d'une zone rectangulaire en remplissant le rectangle spécifié par x, y, width, height avec du noir transparent. Comme l'effacement ne nécessite pas de mélange, il peut être plus rapide que fillRect().

p->beginPath();
p->circle(100, 100, 80);
p->fill();
p->stroke();
p->clearRect(60, 0, 80, 120);

void QCanvasPainter::clearRect(const QRectF &rect)

Efface les pixels d'une zone rectangulaire en remplissant le rectangle spécifié par rect avec du noir transparent. Il s'agit d'une méthode surchargée utilisant QRectF.

Il s'agit d'une fonction surchargée.

void QCanvasPainter::closePath()

Ferme le sous-chemin actuel avec un segment de ligne. Cela équivaut à lineTo([point de départ]) comme dernier élément du chemin.

QCanvasOffscreenCanvas QCanvasPainter::createCanvas(QSize pixelSize, int sampleCount = 1, QCanvasOffscreenCanvas::Flags flags = {})

Renvoie un nouveau canevas hors écran avec les données pixelSize, sampleCount, et flags.

La taille du canevas est spécifiée en pixels. Les propriétés pixelSize, sampleCount, et flags sont immuables par la suite. Pour obtenir un canevas avec une taille, un nombre d'échantillons ou des drapeaux différents, créez-en un nouveau.

Pour cibler un canevas hors écran avec des commandes de dessin, appelez la surcharge QCanvasRhiPaintDriver::beginPaint() appropriée si vous travaillez avec l'API de niveau inférieur, ou QCanvasPainterWidget::beginCanvasPainting() ou QCanvasPainterItemRenderer::beginCanvasPainting() si vous utilisez les classes de widget de commodité ou d'élément Qt Quick.

Normalement, le contenu du canevas est effacé lorsque l'on peint dessus. Pour désactiver cette fonction, passez PreserveContents dans flags.

Pour demander un rendu multi-échantillon sur le canevas (anti-crénelage multi-échantillon, MSAA), définissez un nombre d'échantillons supérieur à 1, par exemple 4 ou 8. La préservation du contenu du canevas entre les passes de rendu n'est cependant pas prise en charge lorsque le multi-échantillonnage est activé, et le drapeau PreserveContents ne fonctionnera pas dans ce cas.

void QCanvasPainter::destroyCanvas(QCanvasOffscreenCanvas &canvas)

Détruit les ressources qui soutiennent canvas. canvas devient alors null canvas.

Le peintre le fait automatiquement lors de sa destruction. Par conséquent, l'appel à cette fonction n'est nécessaire que lorsque la libération des ressources associées est souhaitée immédiatement.

float QCanvasPainter::devicePixelRatio() const

Renvoie le rapport entre les pixels physiques et les pixels indépendants du périphérique. La valeur par défaut est 1.0.

void QCanvasPainter::drawBoxShadow(const QCanvasBoxShadow &shadow)

Dessine une boîte shadow. L'ombre sera peinte avec la position, la taille, la couleur, le flou, etc. définis dans la méthode shadow. Il n'est pas nécessaire d'appeler beginPath() avant cette méthode.

Remarque : pour visualiser la zone couverte par drawBoxShadow(), définissez la variable d'environnement QCPAINTER_DEBUG_SHADOW_RECT.

QRectF rect(40, 40, 120, 120);
QRectF shadowRect = rect.translated(-2, 4);
QCanvasBoxShadow shadow(shadowRect, 0, 30);
p->drawBoxShadow(shadow);
p->beginPath();
p->roundRect(rect, 30);
p->setFillStyle("#2CDE85");
p->fill();

Voir également QCanvasBoxShadow.

void QCanvasPainter::drawImage(const QCanvasImage &image, float x, float y)

Dessine image dans x, y, à sa taille par défaut.

static QImage logo(":/qt_logo.png");
QCanvasImage image = p->addImage(logo);
p->drawImage(image, 36, 36);

Voir aussi addImage().

void QCanvasPainter::drawImage(const QCanvasImage &image, const QRectF &destinationRect)

Dessine image à la position et à la taille de destinationRect.

Il s'agit d'une fonction surchargée.

Voir aussi addImage().

void QCanvasPainter::drawImage(const QCanvasImage &image, const QRectF &sourceRect, const QRectF &destinationRect)

Dessine image à la position et à la taille de destinationRect, à partir de la zone sourceRect de l'image.

static QImage logo(":/qt_logo.png");
QCanvasImage image = p->addImage(logo);
QRectF sourceRect(20, 30, 54, 76);
QRectF destinationRect(0, 0, 200, 200);
p->drawImage(image, sourceRect, destinationRect);

Il s'agit d'une fonction surchargée.

Voir aussi addImage().

void QCanvasPainter::drawImage(const QCanvasImage &image, float x, float y, float width, float height)

Dessine image en x, y, à width et height.

static QImage logo(":/qt_logo.png");
QCanvasImage image = p->addImage(logo);
p->drawImage(image, 50, 0, 100, 200);

Il s'agit d'une fonction surchargée.

Voir aussi addImage().

void QCanvasPainter::ellipse(float centerX, float centerY, float radiusX, float radiusY)

Crée un nouveau sous-chemin en forme d'ellipse dans ( centerX, centerY) avec radiusX et radiusY.

p->beginPath();
p->ellipse(100, 100, 80, 60);
p->fill();
p->stroke();

void QCanvasPainter::ellipse(const QRectF &rect)

Crée un nouveau sous-chemin en forme d'ellipse dans rect. Cette ellipse couvrira la zone rect.

QRectF rect(40, 20, 120, 160);
p->fillRect(rect);
p->beginPath();
p->ellipse(rect);
p->stroke();

Il s'agit d'une fonction surchargée.

void QCanvasPainter::ellipse(QPointF centerPoint, float radiusX, float radiusY)

Crée un nouveau sous-chemin en forme d'ellipse dans centerPoint avec radiusX et radiusY.

Il s'agit d'une fonction surchargée.

void QCanvasPainter::fill()

Remplit le chemin actuel avec le style de remplissage actuel.

p->beginPath();
p->rect(20, 20, 40, 160);
p->rect(140, 20, 40, 160);
p->circle(100, 100, 60);
p->fill();

Voir également setFillStyle().

void QCanvasPainter::fill(const QCanvasPath &path, int pathGroup = 0)

Remplit path avec le style de remplissage actuel et appartient à pathGroup. La peinture à travers QCanvasPath est optimale lorsque le chemin contient plus de commandes et qu'il est principalement statique. Par défaut, pathGroup est 0, ce qui permet d'utiliser le premier groupe. Lorsque pathGroup est -1, le chemin ne sera pas mis en cache du côté du GPU. Plus d'informations sur l'utilisation des groupes de cache de chemin dans la documentation de QCanvasPath. Il n'est pas nécessaire d'appeler beginPath() avant cette méthode.

// m_path is QCanvasPath
if (m_path.isEmpty()) {
    for (int i = 0; i < 16; i++) {
        float w = 100 + 60 * sin(i);
        m_path.rect(100 - w * 0.5,
                    22 + i * 10,
                    w, 6);
    }
}
p->fill(m_path);

Il s'agit d'une fonction surchargée.

Voir également setFillStyle().

void QCanvasPainter::fillRect(float x, float y, float width, float height)

Dessine un rectangle rempli à la position spécifiée ( x, y) à la taille width, height.

Remarque : cette fonction est fournie pour des raisons de commodité. Pour remplir plus d'un rectangle, il est préférable d'utiliser rect().

p->fillRect(20, 20, 160, 160);
// The above code does same as:
//  p->beginPath();
//  p->rect(20, 20, 160, 160);
//  p->fill();

void QCanvasPainter::fillRect(const QRectF &rect)

Dessine un rectangle rempli dans rect. Il s'agit d'une méthode surchargée utilisant QRectF.

Remarque : cette méthode est fournie pour des raisons de commodité. Pour remplir plus d'un rectangle, il est préférable d'utiliser rect().

Il s'agit d'une fonction surchargée.

void QCanvasPainter::fillText(const QString &text, float x, float y, float maxWidth = -1)

Dessine la chaîne text à l'emplacement spécifié ( x, y), avec les paramètres textAlign et textBaseline actuels. Pour que le texte s'étende sur plusieurs lignes, le paramètre facultatif maxWidth doit correspondre à la largeur de ligne souhaitée en pixels. Les espaces blancs sont supprimés au début des lignes, le texte est scindé aux limites des mots ou lorsque des caractères de nouvelle ligne sont rencontrés. Les mots plus longs que la largeur maximale sont coupés au caractère le plus proche (c'est-à-dire qu'il n'y a pas de césure).

void QCanvasPainter::fillText(const QString &text, const QRectF &rect)

Dessine la chaîne text à l'intérieur de rect, avec les paramètres textAlign et textBaseline actuels. La largeur du paramètre rect est utilisée comme maxWidth.

Il s'agit d'une méthode surchargée qui utilise QRectF. Il est souvent utile de fixer la ligne de base du texte à TextBaseline::Top ou TextBaseline::Middle lorsque l'on peint du texte avec cette méthode.

Il s'agit d'une fonction surchargée.

void QCanvasPainter::fillText(const QString &text, QPointF point, float maxWidth = -1)

Dessine la chaîne text à l'emplacement spécifié point, avec les paramètres textAlign et textBaseline actuels. Pour que le texte s'étende sur plusieurs lignes, le paramètre facultatif maxWidth doit correspondre à la largeur de ligne souhaitée en pixels. Les espaces blancs sont supprimés au début des lignes, le texte est scindé aux limites des mots ou lorsque des caractères de nouvelle ligne sont rencontrés. Les mots plus longs que la largeur maximale sont coupés au caractère le plus proche (c'est-à-dire sans césure).

Il s'agit d'une méthode surchargée utilisant QPointF.

Il s'agit d'une fonction surchargée.

QTransform QCanvasPainter::getTransform() const

Renvoie la transformation actuelle.

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

Ajoute un segment de ligne à partir du dernier point du chemin jusqu'au point ( x, y).

p->beginPath();
p->moveTo(20, 20);
p->lineTo(140, 180);
p->lineTo(180, 120);
p->stroke();

void QCanvasPainter::lineTo(QPointF point)

Ajoute un segment de ligne depuis le dernier point du chemin jusqu'à point.

Il s'agit d'une fonction surchargée.

[static] float QCanvasPainter::mmToPx(float mm)

Méthode d'aide statique pour convertir les millimètres mm en pixels. Cela permet de réaliser des dessins indépendants de la résolution. Par exemple, pour définir la largeur de la ligne à 2 mm, utilisez :

painter->setLineWidth(QCanvasPainter::mmToPx(2)) ;

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

Commence un nouveau sous-chemin avec ( x, y) comme premier point.

void QCanvasPainter::moveTo(QPointF point)

Commence un nouveau sous-chemin avec point comme premier point.

Il s'agit d'une fonction surchargée.

[static] float QCanvasPainter::ptToPx(float pt)

Méthode d'aide statique pour convertir les points pt en pixels.

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

Ajoute un segment de bézier quadratique à partir du dernier point de la trajectoire via un point de contrôle (cpX, cpY) jusqu'au point spécifié (x, y).

p->beginPath();
p->moveTo(20, 20);
p->quadraticCurveTo(150, 50, 180, 180);
p->quadraticCurveTo(20, 220, 20, 20);
p->fill();
p->stroke();

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

Ajoute un segment de bézier quadratique à partir du dernier point de la trajectoire via une adresse controlPoint jusqu'à l'adresse endPoint spécifiée.

Il s'agit d'une fonction surchargée.

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

Crée un nouveau sous-chemin en forme de rectangle à la position x, y avec la taille width, height.

p->beginPath();
p->rect(20, 20, 160, 160);
p->fill();
p->stroke();

void QCanvasPainter::rect(const QRectF &rect)

Crée un nouveau sous-chemin en forme de rectangle à l'adresse rect. Il s'agit d'une méthode surchargée utilisant QRectF.

Il s'agit d'une fonction surchargée.

void QCanvasPainter::removeImage(const QCanvasImage &image)

Libère les ressources associées à image et supprime l'image du peintre.

Remarque : il n'est pas nécessaire d'appeler cette fonction normalement, car les ressources telles que les textures sont de toute façon libérées dans le destructeur du peintre. Cette fonction est utile lorsqu'il est nécessaire de réduire l'utilisation de la mémoire en raison d'un grand nombre d'images, et que certaines d'entre elles ne sont plus utilisées.

Remarque : les images supprimées ne peuvent plus être utilisées dans les opérations de peinture.

Remarque : les ressources telles que les textures créées avec l'API 3D sous-jacente peuvent ne pas être libérées immédiatement. Ces opérations peuvent être reportées à des images ultérieures, généralement lorsque cette page QCanvasPainter recommence à peindre après que l'ensemble actif d'appels de dessin a été soumis.

Voir également addImage().

void QCanvasPainter::removePathGroup(int pathGroup)

Supprime pathGroup du cache des peintres. L'appel à fill() ou stroke() pour pathGroup après ceci, régénérera le chemin dans le cache du groupe.

Remarque : il n'est pas nécessaire de l'appeler normalement, car les chemins sont supprimés dans le destructeur du peintre. N'utilisez ceci que pour réduire l'utilisation de la mémoire lorsque pathGroup n'est plus nécessaire ou, par exemple, lorsque le chemin a beaucoup moins de commandes que par le passé et que la taille du tampon doit être réduite.

Voir aussi fill() et stroke().

QCanvasPainter::RenderHints QCanvasPainter::renderHints() const

Renvoie un drapeau qui spécifie les indices de rendu qui sont définis pour ce peintre.

Voir aussi setRenderHints() et setRenderHint().

void QCanvasPainter::reset()

Réinitialise l'état actuel du peintre aux valeurs par défaut.

Remarque : cette méthode diffère de la méthode HTML canvas 2D context reset() en ce sens qu'elle n'efface pas visuellement les tampons de la toile.

// Adjust the paint state
p->setStrokeStyle("#00414A");
p->setFillStyle("#2CDE85");
p->setLineWidth(10);
QRectF rect(20, 40, 160, 50);
p->translate(rect.center());
p->rotate(qDegreesToRadians(-25));
p->translate(-rect.center());
p->beginPath();
p->roundRect(rect, 20);
p->fill();
p->stroke();
// Reset to default paint state
p->reset();
p->fillRect(20, 140, 60, 40);
p->strokeRect(120, 140, 60, 40);

Voir également save() et restore().

void QCanvasPainter::resetClipping()

Réinitialise et désactive l'écrêtage.

Voir également setClipRect().

void QCanvasPainter::resetTransform()

Réinitialise la transformation actuelle à une matrice d'identité.

void QCanvasPainter::restore()

Supprime et restaure l'état actuel du rendu. L'état précédemment sauvegardé sera donc restauré. Si save() n'a pas été appelé et que la pile d'état est vide, cet appel ne fait rien.

Voir aussi save().

void QCanvasPainter::rotate(float angle)

Fait pivoter le système de coordonnées actuel dans le sens des aiguilles d'une montre de angle.

L'angle est spécifié en radians. Utilisez qDegreesToRadians() pour convertir les degrés en radians.

QRectF rect(20, 70, 160, 60);
p->translate(rect.center());
p->rotate(-M_PI / 4);
p->translate(-rect.center());
p->beginPath();
p->roundRect(rect, 10);
p->fill();
p->stroke();
p->setFillStyle(QColorConstants::Black);
p->fillText("Cute!", rect);

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

Crée un nouveau sous-chemin en forme de rectangle arrondi à la position x, y avec la taille width, height. L'arrondi des coins sera radius.

p->beginPath();
p->roundRect(20, 20, 160, 160, 30);
p->fill();
p->stroke();

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

Crée un nouveau sous-chemin en forme de rectangle arrondi à l'adresse rect avec des coins à l'adresse radius. Il s'agit d'une méthode surchargée utilisant QRectF.

Il s'agit d'une fonction surchargée.

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

Crée un nouveau sous-chemin en forme de rectangle arrondi à l'adresse rect. L'arrondi des coins peut varier d'un coin à l'autre, avec radiusTopLeft, radiusTopRight, radiusBottomRight, radiusBottomLeft.

Il s'agit d'une fonction surchargée.

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

Crée un nouveau sous-chemin en forme de rectangle arrondi à la position x, y avec la taille width, height. L'arrondi des coins peut varier selon les coins, avec radiusTopLeft, radiusTopRight, radiusBottomRight, radiusBottomLeft.

p->beginPath();
p->roundRect(20, 20, 160, 160,
             0, 40, 20, 80);
p->fill();
p->stroke();

Il s'agit d'une fonction surchargée.

void QCanvasPainter::save()

Repousse et enregistre l'état de rendu actuel dans une pile d'états. Un restore() correspondant doit être utilisé pour restaurer l'état.

p->strokeRect(20, 20, 160, 40);
// Save and adjust the paint state
p->save();
p->setStrokeStyle(QColorConstants::Black);
p->setLineWidth(3);
p->rotate(0.1);
p->strokeRect(20, 80, 180, 20);
// Restore the saved paint state
p->restore();
p->strokeRect(20, 140, 160, 40);

Voir aussi restore().

void QCanvasPainter::scale(float scale)

Met à l'échelle le système de coordonnées actuel par scale. Les coordonnées x et y sont mises à l'échelle de manière uniforme.

QRectF rect(20, 20, 160, 160);
for (int i = 0; i < 20; i++) {
    p->beginPath();
    p->roundRect(rect, 10);
    p->stroke();
    p->translate(rect.center());
    p->scale(0.8);
    p->translate(-rect.center());
}

void QCanvasPainter::scale(float scaleX, float scaleY)

Met à l'échelle le système de coordonnées actuel en fonction de scaleX et scaleY.

Il s'agit d'une fonction surchargée.

void QCanvasPainter::setAntialias(float antialias)

Fixe la valeur actuelle de l'anticrénelage à antialias en pixels. Plus il y a d'anticrénelage, plus la peinture est lisse. Cela n'affecte que la peinture de remplissage et de trait, pas les images ou les textes. La valeur par défaut est 1.0 et la valeur maximale est 10.0.

L'anticrénelage peut être modifié par chemin, de sorte qu'il peut être défini avant chaque trait/remplissage. Pour désactiver l'anticrénelage sur l'ensemble de la toile, utilisez QCanvasPainter::RenderHint::Antialiasing render hint.

p->setLineWidth(6);
for (int i = 1; i < 10 ; i++) {
    int y = i * 20;
    p->setAntialias(i);
    p->beginPath();
    p->moveTo(20, y);
    p->bezierCurveTo(80, y + 20, 120,
                     y - 20, 180, y);
    p->stroke();
}

Voir également setRenderHints() et setTextAntialias().

void QCanvasPainter::setBrushTransform(const QTransform &transform)

Définit la transformation actuelle de la brosse à transform. Cette transformation s'applique aux brosses de trait et de remplissage.

void QCanvasPainter::setClipRect(float x, float y, float width, float height)

Définit le rectangle de ciseaux actuel à (x, y, width, height). Le rectangle de ciseaux est transformé par la transformation actuelle.

Remarque : l'écrêtage a un coût en termes de performances et ne doit être utilisé qu'en cas de besoin.

QRectF viewArea(20, 20, 160, 160);
p->setClipRect(viewArea);
p->beginPath();
p->circle(40, 40, 110);
p->fill();
p->setFillStyle(Qt::black);
p->fillText("Clip me...", 40, 100);
p->strokeRect(viewArea);

Voir aussi resetClipping().

void QCanvasPainter::setClipRect(const QRectF &rect)

Définit le rectangle de ciseaux actuel à rect. Le rectangle de ciseaux est transformé par le transformateur actuel.

Remarque : le découpage a un coût en termes de performances et ne doit être utilisé qu'en cas de besoin.

Il s'agit d'une fonction surchargée.

Voir également resetClipping().

void QCanvasPainter::setFillStyle(const QColor &color)

Définit le style de remplissage à un solide color. Le style de remplissage par défaut est un solide de couleur noire (0, 0, 0, 1).

p->setFillStyle(QColorConstants::Black);
p->fillRect(20, 20, 160, 160);
p->setFillStyle(QColor(0, 65, 74));
p->fillRect(40, 40, 120, 120);
p->setFillStyle("#2CDE85");
p->fillRect(60, 60, 80, 80);

void QCanvasPainter::setFillStyle(const QCanvasBrush &brush)

Définit le style de remplissage à brush. Le style de remplissage par défaut est la couleur noire unie (0, 0, 0, 1).

QCanvasRadialGradient g2(140, 40, 300);
g2.setStartColor(QColor(44, 222, 133));
g2.setEndColor(QColor(0, 65, 74));
p->setFillStyle(g2);
p->fillRect(20, 20, 160, 160);
g2.setCenterPosition(100, 100);
p->setFillStyle(g2);
p->fillRect(40, 40, 120, 120);

Il s'agit d'une fonction surchargée.

void QCanvasPainter::setFont(const QFont &font)

Définit la police font comme police active.

void QCanvasPainter::setGlobalAlpha(float alpha)

Fixe la valeur alpha globale (transparence) à alpha. Cette valeur alpha est appliquée à toutes les formes rendues. Les chemins déjà transparents deviendront proportionnellement plus transparents. La valeur alpha doit être comprise entre 0,0 (totalement transparent) et 1,0 (totalement opaque). Par défaut, la valeur alpha est 1.0.

static QImage logo(":/qt_logo2.png");
QCanvasImage image = p->addImage(logo);
p->setFillStyle("#d9f720");
for (int i = 0; i < 4; i++) {
    float x = 100 * (i % 2);
    float y = 100 * (i / 2);
    QRectF rect(x, y, 100, 100);
    p->setGlobalAlpha(1.0 - i * 0.3);
    p->fillRect(rect);
    p->drawImage(image, rect);
}

void QCanvasPainter::setGlobalBrightness(float value)

Fixe la luminosité globale à value. Cette luminosité est appliquée à toutes les formes rendues. Une valeur de 0 rendra la peinture complètement noire. La valeur peut également être supérieure à 1,0 pour augmenter la luminosité. Par défaut, la luminosité est de 1.0.

static QImage logo(":/qt_logo2.png");
QCanvasImage image = p->addImage(logo);
p->setFillStyle("#d9f720");
for (int i = 0; i < 4; i++) {
    float x = 100 * (i % 2);
    float y = 100 * (i / 2);
    QRectF rect(x, y, 100, 100);
    p->setGlobalBrightness(1.5 - i * 0.45);
    p->fillRect(rect);
    p->drawImage(image, rect);
}

void QCanvasPainter::setGlobalCompositeOperation(QCanvasPainter::CompositeOperation operation)

Définit le mode d'opération composite global sur operation. Ce mode est appliqué à toutes les opérations de peinture. Le mode par défaut est QCanvasPainter::CompositeOperation::SourceOver.

void QCanvasPainter::setGlobalContrast(float value)

Définit le contraste global à value. Ce contraste est appliqué à toutes les formes rendues. Une valeur de 0 rendra la peinture complètement grise (0.5, 0.5, 0.5). La valeur peut également être supérieure à 1,0 pour augmenter le contraste. Par défaut, le contraste est de 1.0.

static QImage logo(":/qt_logo2.png");
QCanvasImage image = p->addImage(logo);
p->setFillStyle("#d9f720");
for (int i = 0; i < 4; i++) {
    float x = 100 * (i % 2);
    float y = 100 * (i / 2);
    QRectF rect(x, y, 100, 100);
    p->setGlobalContrast(1.5 - i * 0.45);
    p->fillRect(rect);
    p->drawImage(image, rect);
}

void QCanvasPainter::setGlobalSaturate(float value)

Définit la saturation globale à value. Cette saturation est appliquée à toutes les formes rendues. Une valeur de 0 désactivera la saturation et fera en sorte que la peinture soit entièrement en niveaux de gris. La valeur peut également être supérieure à 1,0 pour augmenter la saturation. Par défaut, la saturation est de 1.0.

static QImage logo(":/qt_logo2.png");
QCanvasImage image = p->addImage(logo);
p->setFillStyle("#d9f720");
for (int i = 0; i < 4; i++) {
    float x = 100 * (i % 2);
    float y = 100 * (i / 2);
    QRectF rect(x, y, 100, 100);
    p->setGlobalSaturate(1.5 - i * 0.5);
    p->fillRect(rect);
    p->drawImage(image, rect);
}

void QCanvasPainter::setLineCap(QCanvasPainter::LineCap cap)

Fixe la fin de la ligne de stoke à cap. La fin de ligne par défaut est QCanvasPainter::LineCap::Butt.

QCanvasPath path;
path.moveTo(40, 60);
path.lineTo(160, 60);
p->setLineCap(QCanvasPainter::LineCap::Butt);
p->stroke(path, -1);
p->setLineCap(QCanvasPainter::LineCap::Square);
p->translate(0, 40);
p->stroke(path, -1);
p->setLineCap(QCanvasPainter::LineCap::Round);
p->translate(0, 40);
p->stroke(path, -1);

void QCanvasPainter::setLineJoin(QCanvasPainter::LineJoin join)

Définit la jointure de ligne du trait à join. La jointure de ligne par défaut est QCanvasPainter::LineJoin::Miter.

QCanvasPath path;
path.moveTo(40, 20);
path.lineTo(100, 80);
path.lineTo(160, 40);
path.lineTo(160, 70);
p->setLineJoin(QCanvasPainter::LineJoin::Miter);
p->stroke(path, -1);
p->setLineJoin(QCanvasPainter::LineJoin::Bevel);
p->translate(0, 50);
p->stroke(path, -1);
p->setLineJoin(QCanvasPainter::LineJoin::Round);
p->translate(0, 50);
p->stroke(path, -1);

Voir également setMiterLimit().

void QCanvasPainter::setLineWidth(float width)

Définit la largeur de ligne du trait à width en pixels. La largeur de ligne par défaut est 1.0. Lorsque l'anticrénelage est activé, les largeurs de ligne inférieures à un pixel diminuent automatiquement l'opacité, créant ainsi une sortie lisse.

for (int i = 1; i < 10 ; i++) {
    int y = i * 20;
    p->setLineWidth(0.5 * i);
    p->beginPath();
    p->moveTo(20, y);
    p->bezierCurveTo(80, y + 20, 120,
                     y - 20, 180, y);
    p->stroke();
}

Voir également stroke().

void QCanvasPainter::setMiterLimit(float limit)

Règle la limite d'onglet sur limit. La limite d'onglet contrôle le moment où un angle aigu est biseauté. Lorsque la longueur de l'angle dépasse cette limite, QCanvasPainter::LineJoin::Bevel est appliqué entre les lignes. Cela n'a d'effet qu'avec la jonction de lignes QCanvasPainter::LineJoin::Miter. La limite par défaut est 10.0.

Voir aussi setLineJoin().

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

Définit le sous-chemin actuel winding en CounterClockWise (par défaut) ou ClockWise. CounterClockWise dessine des sous-chemins pleins tandis que ClockWise dessine des trous.

p->beginPath();
p->roundRect(20, 20, 160, 160, 40);
p->setPathWinding(QCanvasPainter::PathWinding::ClockWise);
p->circle(140, 60, 20);
p->rect(60, 120, 80, 30);
p->fill();
p->stroke();

Voir aussi beginHoleSubPath() et beginSolidSubPath().

void QCanvasPainter::setRenderHint(QCanvasPainter::RenderHint hint, bool on = true)

Définit le rendu donné hint sur le peintre si on est vrai ; sinon, efface l'indication de rendu.

Voir aussi setRenderHints() et renderHints().

void QCanvasPainter::setRenderHints(QCanvasPainter::RenderHints hints, bool on = true)

Définit le rendu donné hints sur le peintre si on est vrai ; sinon, efface les indications de rendu.

Voir aussi setRenderHint() et renderHints().

void QCanvasPainter::setStrokeStyle(const QColor &color)

Définit le style de trait à un solide color. Le style de trait par défaut est une couleur noire solide (0, 0, 0, 1).

p->setStrokeStyle(QColorConstants::Black);
p->strokeRect(20, 20, 160, 160);
p->setStrokeStyle(QColor(0, 65, 74));
p->strokeRect(40, 40, 120, 120);
p->setStrokeStyle("#2CDE85");
p->strokeRect(60, 60, 80, 80);

void QCanvasPainter::setStrokeStyle(const QCanvasBrush &brush)

Définit le style de trait à brush. Le style de trait par défaut est une couleur noire unie (0, 0, 0, 1).

QCanvasLinearGradient g1(180, 20, 20, 180);
g1.setStartColor(QColor(44, 222, 133));
g1.setEndColor(Qt::black);
p->setStrokeStyle(g1);
p->strokeRect(20, 20, 160, 160);
g1.setEndColor(Qt::yellow);
p->setStrokeStyle(g1);
p->strokeRect(40, 40, 120, 120);

Il s'agit d'une fonction surchargée.

void QCanvasPainter::setTextAlign(QCanvasPainter::TextAlign align)

Définit l'alignement horizontal du texte sur align. L'alignement par défaut est QCanvasPainter::TextAlign::Start.

QFont font("Titillium Web", 22);
p->setFont(font);
p->fillRect(100, 0, 1, 200);
p->setTextAlign(QCanvasPainter::TextAlign::Left);
p->fillText("Left", 100, 40);
p->setTextAlign(QCanvasPainter::TextAlign::Center);
p->fillText("Center", 100, 70);
p->setTextAlign(QCanvasPainter::TextAlign::Right);
p->fillText("Right", 100, 100);
p->setTextAlign(QCanvasPainter::TextAlign::Start);
p->fillText("Start", 100, 130);
p->setTextAlign(QCanvasPainter::TextAlign::End);
p->fillText("End", 100, 160);

Voir aussi setTextBaseline().

void QCanvasPainter::setTextAntialias(float antialias)

Définit la valeur actuelle de l'anti-crénelage du texte. La valeur antialias est un multiplicateur de l'anticrénelage normal, ce qui signifie que 0.0 désactive l'anticrénelage et que 2,0 le double. La valeur par défaut est 1.0.

Remarque : en raison de la technique d'anticrénelage du texte utilisée (SDF), la quantité maximale d'anticrénelage est assez limitée et l'effet est moindre lorsque la taille de la police est petite.

QFont font("Titillium Web", 20);
p->setFont(font);
p->setTextAntialias(1.0);
p->fillText("Antialiasing: 1.0", 100, 25);
p->setTextAntialias(2.0);
p->fillText("Antialiasing: 2.0", 100, 75);
p->setTextAntialias(3.0);
p->fillText("Antialiasing: 3.0", 100, 125);
p->setTextAntialias(4.0);
p->fillText("Antialiasing: 4.0", 100, 175);

void QCanvasPainter::setTextBaseline(QCanvasPainter::TextBaseline baseline)

Définit l'alignement vertical (ligne de base) du texte sur baseline. L'alignement par défaut est QCanvasPainter::TextBaseline::Alphabetic.

QFont font("Titillium Web", 16);
p->setFont(font);
p->fillRect(0, 60, 200, 1);
p->fillRect(0, 140, 200, 1);
p->setTextBaseline(QCanvasPainter::TextBaseline::Bottom);
p->fillText("Bottom", 40, 60);
p->setTextBaseline(QCanvasPainter::TextBaseline::Middle);
p->fillText("Middle", 100, 60);
p->setTextBaseline(QCanvasPainter::TextBaseline::Top);
p->fillText("Top", 160, 60);
p->setTextBaseline(QCanvasPainter::TextBaseline::Alphabetic);
p->fillText("Alphabetic", 50, 140);
p->setTextBaseline(QCanvasPainter::TextBaseline::Hanging);
p->fillText("Hanging", 150, 140);

Voir aussi setTextAlign().

void QCanvasPainter::setTextDirection(QCanvasPainter::TextDirection direction)

Définit la direction du texte à direction. La direction par défaut est QCanvasPainter::TextDirection::Inherit.

void QCanvasPainter::setTextLineHeight(float height)

Définit l'ajustement de la hauteur de ligne en pixels à height pour le texte enveloppé. La hauteur de ligne par défaut est 0.

QRectF r1(40, 5, 120, 60);
QRectF r2(40, 70, 120, 60);
QRectF r3(40, 135, 120, 60);
p->strokeRect(r1);
p->strokeRect(r2);
p->strokeRect(r3);
p->setTextLineHeight(-10);
p->fillText("Text with line height: -10", r1);
p->setTextLineHeight(0);
p->fillText("Text with line height: 0", r2);
p->setTextLineHeight(10);
p->fillText("Text with line height: 10", r3);

void QCanvasPainter::setTextWrapMode(QCanvasPainter::WrapMode wrapMode)

Définit le mode d'habillage du texte à wrapMode. Le mode d'habillage par défaut est QCanvasPainter::WrapMode::NoWrap.

QRectF r1(50, 5, 100, 60);
QRectF r2(50, 70, 100, 60);
QRectF r3(50, 135, 100, 60);
p->strokeRect(r1);
p->strokeRect(r2);
p->strokeRect(r3);
QString s("This is a long string.");
p->setTextWrapMode(QCanvasPainter::WrapMode::NoWrap);
p->fillText(s, r1);
p->setTextWrapMode(QCanvasPainter::WrapMode::Wrap);
p->fillText(s, r2);
p->setTextWrapMode(QCanvasPainter::WrapMode::WrapAnywhere);
p->fillText(s, r3);

void QCanvasPainter::setTransform(const QTransform &transform)

Réinitialise la transformation actuelle et utilise transform à la place.

p->beginPath();
p->roundRect(80, 20, 40, 40, 10);
p->fill();
p->stroke();
QTransform t;
t.translate(100, 20);
t.rotate(45);
t.scale(2.0, 2.0);
p->setTransform(t);
p->beginPath();
p->roundRect(20, 20, 40, 40, 10);
p->fill();
p->stroke();

Voir aussi transform().

void QCanvasPainter::skew(float angleX, float angleY = 0.0f)

Incline (cisaille) le système de coordonnées actuel le long de l'axe X par angleX et le long de l'axe Y par angleY. Les angles sont spécifiés en radians.

QRectF rect(40, 70, 120, 60);
p->translate(rect.center());
p->skew(-0.6);
p->translate(-rect.center());
p->beginPath();
p->roundRect(rect, 10);
p->fill();
p->stroke();
p->setFillStyle(QColorConstants::Black);
p->fillText("Cute!", rect);

void QCanvasPainter::stroke()

Trace le chemin actuel avec le style de trait actuel.

p->beginPath();
p->rect(20, 20, 40, 160);
p->rect(140, 20, 40, 160);
p->circle(100, 100, 60);
p->stroke();

Voir également setStrokeStyle().

void QCanvasPainter::stroke(const QCanvasPath &path, int pathGroup = 0)

Trace le path avec le style de trait actuel et l'appartenance au pathGroup. Peindre à travers QCanvasPath est optimal lorsque le chemin contient plus de commandes et qu'il est principalement statique. Par défaut, pathGroup est 0, ce qui permet d'utiliser le premier groupe. Lorsque pathGroup est -1, le chemin ne sera pas mis en cache du côté du GPU. Plus d'informations sur l'utilisation des groupes de cache de chemin dans la documentation de QCanvasPath. Il n'est pas nécessaire d'appeler beginPath() avant cette méthode.

// m_path is QCanvasPath
if (m_path.isEmpty()) {
    for (int i = 0; i < 16; i++) {
        int h = 100 + 60 * sin(i);
        m_path.rect(22 + i * 10,
                    180 - h,
                    6, h);
    }
}
p->stroke(m_path);

Il s'agit d'une fonction surchargée.

Voir également setStrokeStyle().

void QCanvasPainter::strokeRect(float x, float y, float width, float height)

Dessine un rectangle stoked à la position spécifiée ( x, y) à la taille width, height.

Note : Ceci est fourni pour des raisons de commodité. Pour dessiner plus d'un rectangle, il est préférable d'utiliser rect().

p->strokeRect(20, 20, 160, 160);
// The above code does same as:
// p->beginPath();
// p->rect(20, 20, 160, 160);
// p->stroke();

void QCanvasPainter::strokeRect(const QRectF &rect)

Dessine un rectangle stoked dans rect. Il s'agit d'une méthode surchargée utilisant QRectF.

Remarque : cette méthode est fournie pour des raisons de commodité. Pour dessiner plus d'un rectangle, il est préférable d'utiliser rect().

Il s'agit d'une fonction surchargée.

QRectF QCanvasPainter::textBoundingBox(const QString &text, float x, float y, float maxWidth = -1)

Mesure le cadre d'une chaîne text à (x, y). Pour mesurer un texte sur plusieurs lignes, définissez le paramètre facultatif maxWidth sur la largeur de ligne souhaitée en pixels. Renvoie QRectF avec les valeurs [xmin, ymin, largeur, hauteur]. Les valeurs mesurées sont renvoyées dans l'espace de coordonnées locales.

QString s("Built with Qt");
QPointF pos1(20, 20);
QRectF box1 = p->textBoundingBox(s, pos1);
p->strokeRect(box1);
p->fillText(s, pos1);
p->setTextWrapMode(QCanvasPainter::WrapMode::WordWrap);
p->setTextAlign(QCanvasPainter::TextAlign::Center);
QPointF pos2(100, 80);
QRectF box2 = p->textBoundingBox(s, pos2, 100);
p->strokeRect(box2);
p->fillText(s, pos2, 100);

QRectF QCanvasPainter::textBoundingBox(const QString &text, const QRectF &rect)

Mesure la boîte de délimitation d'une chaîne text à rect. Renvoie QRectF avec les valeurs [xmin, ymin, width, height]. Les valeurs mesurées sont renvoyées dans l'espace de coordonnées local.

Il s'agit d'une fonction surchargée.

QRectF QCanvasPainter::textBoundingBox(const QString &text, QPointF point, float maxWidth = -1)

Mesure le cadre d'une chaîne de caractères text à l'adresse point. Pour mesurer un texte sur plusieurs lignes, définissez le paramètre facultatif maxWidth sur la largeur de ligne souhaitée en pixels. Retourne QRectF avec les valeurs [xmin, ymin, largeur, hauteur]. Les valeurs mesurées sont renvoyées dans l'espace de coordonnées local.

Il s'agit d'une fonction surchargée.

void QCanvasPainter::transform(const QTransform &transform)

Multiplie le système de coordonnées actuel par la valeur spécifiée transform.

QTransform t;
t.translate(100, 100);
t.rotate(36);
t.translate(-100, -100);
for (int i = 0; i < 10; i++) {
    p->transform(t);
    p->beginPath();
    p->roundRect(80, 15, 40, 20, 10);
    p->fill();
    p->stroke();
}

Voir également setTransform().

void QCanvasPainter::translate(float x, float y)

Traduit le système de coordonnées actuel par x et y.

auto paintRect = [p]() {
    p->beginPath();
    p->roundRect(20, 20, 160, 60, 10);
    p->fill();
    p->stroke();
};
paintRect();
p->translate(0, 100);
paintRect();

void QCanvasPainter::translate(QPointF point)

Traduit le système de coordonnées actuel par point.

Il s'agit d'une fonction surchargée.

© 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.