En esta página

QCanvasPainter Class

La clase QCanvasPainter realiza pintura acelerada por hardware en QRhi. Más...

Cabecera: #include <QCanvasPainter>
CMake: find_package(Qt6 REQUIRED COMPONENTS CanvasPainter)
target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter)
Desde: Qt 6.11
Estado: Avance técnico

Tipos Públicos

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 }

Funciones Públicas

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)

Miembros públicos estáticos

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

Descripción Detallada

Qt Canvas Painter (QCanvasPainter) proporciona una API de pintura optimizada para pintura acelerada por hardware (GPU). La API sigue de cerca la especificación HTML Canvas 2D Context, portado a Qt C++. También está influenciada por QPainter, pero con una API más compacta.

He aquí un sencillo ejemplo de uso de QCanvasPainter para crear un botón redondo.

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);

Aquí tienes otro ejemplo de cómo pintar un gráfico sencillo.

// 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();

Características

En su mayor parte y desde el punto de vista de la nomenclatura, QCanvasPainter sigue de cerca el Contexto HTML Canvas 2D (https://html.spec.whatwg.org/multipage/canvas.html#2dcontext). Esto hace que la API sea familiar de usar para muchos desarrolladores, y con la capacidad de reutilizar fácilmente el código canvas existente. Pero el objetivo NO es ser 100% compatible con el canvas HTML. A QCanvasPainter le faltan algunas de las características para hacerlo más simple, más performante en QRhi hardware accelerated graphics API, y para apuntar mejor a las necesidades modernas de UI. Debido a estas razones, QCanvasPainter también tiene características adicionales en comparación con HTML Canvas 2D Context.

Estas son algunas de las funcionalidades que, al menos actualmente, echamos en falta en comparación con HTML canvas:

  • Recorte: Todos los recortes son rectángulos (transformados) y no se admite el recorte de trazados.
  • Modo de relleno: Sólo se admite la regla de relleno por defecto No-cero, no se admite la regla de relleno Par-impar.
  • Rayas: Los trazos son siempre líneas sólidas, no se admiten patrones de trazos discontinuos.
  • Comprobación de trayectorias: No hay métodos isPointInPath() o isPointInStroke().
  • Trazo de texto: No se admite el trazado de contornos de texto.
  • Filtros: No se admiten los efectos de filtro SVG de lienzo.
  • Modos compuestos: La cantidad de modos compuestos está limitada a 3, que pueden ser soportados sin renderizar en buffers extra.
  • Sombras: Los métodos de sombra incorporados no son compatibles.

Por otro lado, algunas de las características adicionales que ofrece QCanvasPainter en comparación con HTML canvas incluyen:

  • Grupos de rutas: QCanvasPainter permite pintar en rutas estáticas y almacenar en caché estas rutas como grupos para un uso óptimo de la GPU.
  • Antialiasing ajustable: Debido al antialiasing de vértices de ruta y al renderizado de texto SDF, la cantidad de píxeles de antialiasing se puede ajustar libremente para una pintura más suave.
  • Gradiente de caja: Además de los degradados lineales, radiales y cónicos, QCanvasPainter soporta también el degradado de rectángulo redondeado.
  • Sombra de caja: QCanvasPainter soporta también CSS box-shadow tipo de pincel. El renderizado utiliza un enfoque SDF similar al de Qt Quick RectangularShadow , lo que le confiere un gran rendimiento.
  • Patrones de cuadrícula: QCanvasPainter soporta QCanvasGridPattern para los estilos de rejilla dinámica y patrón de barras.
  • Pinceles personalizados: QCanvasPainter también permite el relleno y el trazo con sombreadores de vértices y fragmentos personalizados (QCanvasCustomBrush). Estos pinceles personalizados también se pueden utilizar para el texto.
  • Ajuste de texto: QCanvasPainter soporta el ajuste automático de texto en varias líneas, con diferentes modos de ajuste.
  • Efectos de color: Además de globalAlpha, QCanvasPainter soporta también brillo global, contraste y saturación.
  • Imágenes tintadas: QCanvasPainter añade soporte de tinte de color para imágenes pintadas y patrones de imagen.

QCanvasPainter es agnóstico a la arquitectura, y utilizable tanto para aplicaciones Qt Quick y Qt Widgets. En realidad, es utilizable incluso sin ninguna de ellas, sólo con QWindow y QRhi. Para utilizar QCanvasPainter, úsalo desde una de estas clases, dependiendo de la arquitectura de tu aplicación:

Reglas de relleno

QCanvasPainter utiliza nonzero (WindingFill) fillrule. Para seleccionar el relleno basándose en la dirección de los puntos del trazado, desactive el forzado de enrollado configurando DisableWindingEnforce rendering hint con 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();

Sin embargo, un caso más común es confiar en el forzado del bobinado y establecer el bobinado preferido utilizando setPathWinding() o beginHoleSubPath() y beginSolidSubPath() helpers.

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();

Documentación de tipos de miembros

enum class QCanvasPainter::CompositeOperation

Qt Canvas Painter soporta 3 operaciones compuestas:

ConstanteValorDescripción
QCanvasPainter::CompositeOperation::SourceOver0El valor por defecto. Dibuja nuevas formas sobre el contenido existente.
QCanvasPainter::CompositeOperation::SourceAtop1La nueva forma sólo se dibuja donde se solapa con el contenido existente.
QCanvasPainter::CompositeOperation::DestinationOut2El contenido existente se mantiene donde no se solapa con la nueva forma.

Ver también setGlobalCompositeOperation().

enum class QCanvasPainter::ImageFlag
flags QCanvasPainter::ImageFlags

Este enum especifica banderas relacionadas con imágenes. Usar con addImage() para establecer las banderas.

ConstanteValorDescripción
QCanvasPainter::ImageFlag::GenerateMipmaps1 << 0Establézcalo para generar mipmaps para la imagen. Los mipmaps deben usarse cuando se prefiere una salida más suave para imágenes que se escalan a un tamaño menor que el original.
QCanvasPainter::ImageFlag::RepeatX1 << 1Usar con patrón de imagen para repetir la imagen en la coordenada X.
QCanvasPainter::ImageFlag::RepeatY1 << 2Usar con patrón de imagen para repetir la imagen en coordenadas Y.
QCanvasPainter::ImageFlag::RepeatRepeatX | RepeatYUsar con patrón de imagen para repetir la imagen en ambas coordenadas.
QCanvasPainter::ImageFlag::FlipY1 << 3Voltea (invierte) la imagen en dirección Y al renderizarla.
QCanvasPainter::ImageFlag::Premultiplied1 << 4Los datos de la imagen tienen alfa premultiplicado.
QCanvasPainter::ImageFlag::Nearest1 << 5La interpolación de la imagen es Cercana en lugar de Lineal.
QCanvasPainter::ImageFlag::NativeTexture1 << 6Indica que se trata de una textura fuera de QCanvasPainter.

El tipo ImageFlags es un typedef para QFlags<ImageFlag>. Almacena una combinación OR de valores ImageFlag.

enum class QCanvasPainter::LineCap

LineCap se utiliza para definir cómo se dibuja el final de la línea (cap).

ConstanteValorDescripción
QCanvasPainter::LineCap::Butt0(por defecto) Final de línea cuadrado que no cubre el punto final de la línea.
QCanvasPainter::LineCap::Round1Final de línea redondo.
QCanvasPainter::LineCap::Square2Final de línea cuadrado que cubre el punto final y se extiende más allá de él la mitad del ancho de la línea.

Véase también setLineCap().

enum class QCanvasPainter::LineJoin

LineJoin se utiliza para definir cómo se dibujan las uniones entre dos líneas conectadas.

ConstanteValorDescripción
QCanvasPainter::LineJoin::Round0Se rellena el arco circular entre las dos líneas.
QCanvasPainter::LineJoin::Bevel1Se rellena la muesca triangular entre las dos líneas.
QCanvasPainter::LineJoin::Miter2(por defecto) Los bordes exteriores de las líneas se extienden para encontrarse en un ángulo, y esta área se rellena.

Véase también setLineJoin() y setMiterLimit().

enum class QCanvasPainter::PathConnection

Con algunos métodos de dibujo se utiliza PathConnection para especificar si el nuevo trazado debe conectarse al último punto del trazado anterior.

ConstanteValorDescripción
QCanvasPainter::PathConnection::NotConnected0No se dibuja ninguna línea desde el último punto de la trayectoria anterior hasta el primer punto de la trayectoria actual.
QCanvasPainter::PathConnection::Connected1El último punto de la trayectoria anterior se conectará al primer punto de la trayectoria actual.

Véase también arc().

enum class QCanvasPainter::PathWinding

PathWinding se utiliza para especificar la dirección de trazado de la ruta. Esta dirección se utiliza para determinar si un subtrayecto es sólido o hueco en el trayecto.

ConstanteValorDescripción
QCanvasPainter::PathWinding::CounterClockWise0(por defecto) Sentido antihorario para formas sólidas.
QCanvasPainter::PathWinding::ClockWise1En el sentido de las agujas del reloj para los agujeros.

Ver también setPathWinding().

enum class QCanvasPainter::RenderHint
flags QCanvasPainter::RenderHints

Este enum especifica banderas a QCanvasPainter relacionadas con el renderizado. Usa setRenderHint() para establecer las banderas.

ConstanteValorDescripción
QCanvasPainter::RenderHint::Antialiasing1 << 0Establecerlo a false desactiva el antialiasing. Activarlo resulta en un mayor coste de renderizado. El valor por defecto es true.
QCanvasPainter::RenderHint::HighQualityStroking1 << 1Establecerlo a true da un renderizado más correcto en algunos casos menos comunes donde el trazo se solapa y no tiene opacidad completa. Habilitarlo resulta en un mayor coste de renderizado. El valor por defecto es false.
QCanvasPainter::RenderHint::DisableWindingEnforce1 << 2Establecerlo a true deshabilita la imposición del enrollado de la ruta para que coincida con lo que se ha establecido en setPathWinding(). Deshabilitarlo permite, por ejemplo, crear agujeros en las rutas añadiendo los puntos en el orden de las agujas del reloj. La desactivación también puede aumentar el rendimiento.

El tipo RenderHints es un typedef para QFlags<RenderHint>. Almacena una combinación OR de valores RenderHint.

enum class QCanvasPainter::TextAlign

TextAlign se utiliza para definir cómo se alinea el texto horizontalmente.

ConstanteValorDescripción
QCanvasPainter::TextAlign::Left0Alinea el lado izquierdo del texto horizontalmente a la posición especificada.
QCanvasPainter::TextAlign::Right1Alinea el lado derecho del texto horizontalmente a la posición especificada.
QCanvasPainter::TextAlign::Center2Alinear el centro del texto horizontalmente a la posición especificada.
QCanvasPainter::TextAlign::Start3(por defecto) El texto se alinea al inicio normal de la línea (alineado a la izquierda para las configuraciones regionales de izquierda a derecha, alineado a la derecha para las configuraciones regionales de derecha a izquierda).
QCanvasPainter::TextAlign::End4El texto se alinea al final normal de la línea (alineado a la derecha para locales de izquierda a derecha, alineado a la izquierda para locales de derecha a izquierda).

Véase también setTextAlign(), setTextDirection() y fillText().

enum class QCanvasPainter::TextBaseline

TextBaseline se utiliza para definir cómo se alinea el texto verticalmente.

ConstanteValorDescripción
QCanvasPainter::TextBaseline::Top0Alinea la parte superior del texto verticalmente a la posición especificada.
QCanvasPainter::TextBaseline::Hanging1Alinea la línea de base del texto verticalmente en la posición especificada.
QCanvasPainter::TextBaseline::Middle2Alinear el centro del texto verticalmente en la posición especificada.
QCanvasPainter::TextBaseline::Alphabetic3(por defecto) Alinear la línea de base del texto verticalmente en la posición especificada.
QCanvasPainter::TextBaseline::Bottom4Alinear la parte inferior del texto verticalmente en la posición especificada.

Véase también setTextBaseline() y fillText().

enum class QCanvasPainter::TextDirection

TextDirection se utiliza para definir cómo se alinea el texto horizontalmente.

ConstanteValorDescripción
QCanvasPainter::TextDirection::LeftToRight0La dirección del texto es de izquierda a derecha.
QCanvasPainter::TextDirection::RightToLeft1La dirección del texto es de derecha a izquierda.
QCanvasPainter::TextDirection::Inherit2(por defecto) La dirección del texto se hereda de QGuiApplication layoutDirection. Véase https://doc.qt.io/qt-6/qguiapplication.html#layoutDirection-prop.
QCanvasPainter::TextDirection::Auto3La dirección del texto se detecta automáticamente a partir de la cadena de texto. Véase QString::isRightToLeft().

Nota: Como esto requiere analizar el texto, es potencialmente más lento que otras opciones.

Véase también setTextDirection(), setTextAlign(), y fillText().

enum class QCanvasPainter::WrapMode

WrapMode se utiliza para definir cómo se envuelve el texto en varias líneas.

ConstanteValorDescripción
QCanvasPainter::WrapMode::NoWrap0(por defecto) No se envolverá el texto. Si el texto no contiene suficientes nuevas líneas, entonces contentWidth excederá el ancho establecido.
QCanvasPainter::WrapMode::Wrap1Si es posible, el ajuste se realiza en el límite de la palabra; de lo contrario, se realizará en el punto apropiado de la línea, incluso en medio de una palabra.
QCanvasPainter::WrapMode::WordWrap2El ajuste sólo se realiza en los límites de palabra. Si una palabra es demasiado larga, la anchura del contenido superará la anchura establecida.
QCanvasPainter::WrapMode::WrapAnywhere3El ajuste se realiza en cualquier punto de la línea, incluso en medio de una palabra.

Véase también setTextWrapMode() y fillText().

Documentación de las funciones miembro

QCanvasPainter::QCanvasPainter()

Construye un pintor.

[noexcept] QCanvasPainter::~QCanvasPainter()

Destruye al pintor.

qsizetype QCanvasPainter::activeImageCount() const

Devuelve el número de objetos QCanvasImage activos registrados con este QCanvasPainter. Esto también incluye las imágenes creadas internamente para gradients.

QCanvasImage Los objetos creados mediante el registro de instancias de QCanvasOffscreenCanvas o texturas gestionadas externamente no son tenidos en cuenta por esta función.

Véase también activeImageMemoryUsage(), addImage(), y removeImage().

qsizetype QCanvasPainter::activeImageMemoryUsage() const

Devuelve una aproximación en kilobytes de la memoria utilizada por los datos de la imagen (píxel) para todas las instancias activas de QCanvasImage para este pintor que fueron creadas por la sobrecarga addImage() tomando un QImage. También incluye los datos de las imágenes creadas internamente para gradients.

QCanvasPainter no guarda copias de los datos QImage del lado de la CPU una vez que addImage() ha retornado. Por lo tanto, el resultado de esta función es una aproximación de la memoria de la GPU que se utiliza para las texturas.

Nota: El valor es sólo una estimación basada en el formato y dimensiones de la imagen. Qt no tiene conocimiento de cómo se almacenan los datos de las texturas en la memoria de la GPU.

Los lienzos fuera de pantalla y las texturas gestionadas externamente registradas a través de otras sobrecargas de addImage() no son tenidas en cuenta por esta función.

Para cada QCanvasImage válido, el tamaño individual en bytes siempre puede consultarse llamando a sizeInBytes(). Esa función devuelve resultados válidos también cuando el QCanvasImage se creó a partir de un QCanvasOffscreenCanvas o QRhiTexture, pero no tiene en cuenta los datos mipmap o multimuestra.

Véase también activeImageCount(), addImage() y removeImage().

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

Añade image con flags disponible para el pintor como textura. Devuelve QCanvasImage con el id de la textura y otra información sobre la imagen. El QCanvasImage devuelto puede ser usado con drawImage y QCanvasImagePattern. Después de llamar a este método, image QImage no necesita ser mantenido en memoria.

Llamar con el mismo image es una operación barata, ya que se espera un golpe de caché.

Hay que tener cuidado al optimizar para llamar a addImage() sólo una vez. Esto no siempre es suficiente, dependiendo del diseño de la aplicación. Por ejemplo, si los recursos gráficos subyacentes se pierden, por ejemplo porque el pintor está asociado con un nuevo QRhi bajo el capó debido a mover un widget a un nuevo nivel superior, entonces llamar a esta función es esencial para volver a crear las texturas gráficas nativas desde image.

Véase también drawImage() y removeImage().

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

Añade texture con flags disponible para el pintor como textura. La bandera NativeTexture se establece implícitamente. El QCanvasImage devuelto se puede utilizar con drawImage y QCanvasImagePattern.

Nota: No se toma la propiedad de texture.

Esta es una función sobrecargada.

Véase también drawImage() y removeImage().

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

Registra canvas con flags al pintor para que esté disponible como imagen. El QCanvasImage devuelto puede utilizarse con drawImage y QCanvasImagePattern.

Nota: canvas sigue gestionando los recursos gráficos nativos subyacentes, lo que significa que removeImage() no invalida canvas.

Se trata de una función sobrecargada.

Véase también drawImage() y removeImage().

void QCanvasPainter::addPath(const QPainterPath &path)

Añade path a la ruta actual.

Nota: QCanvasPainter usa WindingFill (no cero) fillrule, lo que significa que todos los QPainterPaths no se renderizan correctamente. Esto es notable, por ejemplo, cuando la ruta contiene caracteres de texto con agujeros.

Nota: Este método está disponible principalmente por compatibilidad con QPainter y QPainterPath. No incrementa el rendimiento comparado con pintar la ruta directamente con los métodos de QCanvasPainter.

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

Añade path a la ruta actual, utilizando opcionalmente transform para modificar los puntos de la ruta. Cuando no se proporciona transform (o es matriz de identidad), esta operación es muy rápida, ya que reutiliza los datos de la ruta.

// 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())

Añade path a la ruta actual, empezando por el comando en start e incluyendo count cantidad de comandos. Opcionalmente utiliza transform para alterar los puntos de la ruta. Se comprueba el rango de start y count, para que no se acceda a más comandos que QCanvasPath::commandsSize(). En caso de que la ruta no deba continuar desde la posición actual de la ruta, llame primero a moveTo() por ejemplo con 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)

Crea una nueva subtrayectoria en forma de arco circular. El centro del arco está en centerX, centerY, con radius, y el arco se dibuja desde el ángulo a0 a a1, y se barre en direction (ClockWise o CounterClockWise). Cuando connection es NotConnected, arc no añade una línea desde la posición de la trayectoria anterior hasta el inicio del arco. Los ángulos se especifican en radianes.

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

Nota: Mientras que el contexto HTML canvas 2D utiliza arc() para pintar círculos, con QCanvasPainter se recomienda utilizar circle() o ellipse() para aquellos.

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

Crea una nueva subtrayectoria en forma de arco circular. El centro del arco está en centerPoint, con radius, y el arco se dibuja desde el ángulo a0 hasta a1, y se barre en direction (ClockWise o CounterClockWise). Cuando connection es NotConnected, arc no añade una línea desde la posición de la trayectoria anterior hasta el inicio del arco. Los ángulos se especifican en radianes.

Nota: Mientras que el contexto HTML canvas 2D utiliza arc() para pintar círculos, con QCanvasPainter se recomienda utilizar circle() o ellipse() para aquellos.

Esta es una función sobrecargada.

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

Añade un segmento de arco en la esquina definida por el último punto de la trayectoria, y dos puntos especificados (x1, y1 y x2, y2) con radius. El arco se conecta automáticamente al último punto de la ruta con una línea recta si es necesario.

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)

Añade un segmento de arco en la esquina definida por el último punto de la trayectoria, y dos puntos especificados (controlPoint1 y controlPoint2) con radius. El arco se conecta automáticamente al último punto del camino con una línea recta si es necesario.

Se trata de una función sobrecargada.

void QCanvasPainter::beginHoleSubPath()

Iniciar una subtrayectoria de agujeros. Esto es equivalente a 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();

Véase también beginSolidSubPath().

void QCanvasPainter::beginPath()

Comienza a dibujar un nuevo trazado mientras borra el trazado actual.

void QCanvasPainter::beginSolidSubPath()

Iniciar un subcamino sólido. Equivale a setPathWinding(QCanvasPainter::PathWinding::CounterClockWise))

Véase también beginHoleSubPath().

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

Añade un segmento bezier cúbico desde el último punto de la trayectoria a través de dos puntos de control (cp1X, cp1Y y cp2X, cp2Y) hasta el punto especificado (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)

Añade un segmento bezier cúbico desde el último punto de la trayectoria a través de dos puntos de control (controlPoint1 y controlPoint2) hasta el punto especificado endPoint.

Se trata de una función sobrecargada.

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

Crea una nueva sub-ruta en forma de círculo en ( centerX, centerY) con radius.

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

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

Crea una nueva sub-ruta en forma de círculo en centerPoint con radius.

Se trata de una función sobrecargada.

void QCanvasPainter::cleanupResources()

Programa la eliminación de texturas no utilizadas de la caché.

Además, otras cachés y pools pueden ser reducidos al llamar a esta función, con el fin de minimizar el uso de memoria. Esto puede llevar a llamadas de dibujo más caras.

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

Borra los píxeles de un área rectangular rellenando el rectángulo especificado por x, y, width, height con negro transparente. Como el borrado no necesita mezcla, puede ser más rápido 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)

Borra los píxeles de un área rectangular rellenando el rectángulo especificado por rect con negro transparente. Este es un método sobrecargado que utiliza QRectF.

Esta es una función sobrecargada.

void QCanvasPainter::closePath()

Cierra la sub-ruta actual con un segmento de línea. Esto equivale a lineTo([punto de partida]) como último elemento de la ruta.

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

Devuelve un nuevo lienzo fuera de pantalla con los valores pixelSize, sampleCount, y flags.

El tamaño del lienzo se especifica en píxeles. Las propiedades pixelSize, sampleCount, y flags son inmutables después. Para obtener un lienzo con un tamaño, recuento de muestras o banderas diferentes, crea uno nuevo.

Para apuntar a un lienzo fuera de la pantalla con comandos de dibujo, llame a la sobrecarga apropiada QCanvasRhiPaintDriver::beginPaint() cuando trabaje con la API de nivel inferior, o QCanvasPainterWidget::beginCanvasPainting() o QCanvasPainterItemRenderer::beginCanvasPainting() cuando utilice las clases widget de conveniencia o elemento Qt Quick.

Normalmente, el contenido del lienzo se borra cuando se pinta en él. Para desactivar esto, pase PreserveContents en flags.

Para solicitar un renderizado multimuestra sobre el lienzo (antialiasing multimuestra, MSAA), establece un número de muestras mayor que 1, como 4 u 8. Sin embargo, no es posible conservar el contenido del lienzo entre pasadas de renderizado cuando está activado el multimuestreo, y la bandera PreserveContents no funcionará en este caso.

void QCanvasPainter::destroyCanvas(QCanvasOffscreenCanvas &canvas)

Destruye los recursos que respaldan canvas. canvas se convierte entonces en null canvas.

El pintor lo hace automáticamente al destruirlo. Por lo tanto, llamar a esta función sólo es necesario cuando se desea liberar los recursos asociados de inmediato.

float QCanvasPainter::devicePixelRatio() const

Devuelve la proporción entre píxeles físicos y píxeles independientes del dispositivo. El valor por defecto es 1.0.

void QCanvasPainter::drawBoxShadow(const QCanvasBoxShadow &shadow)

Dibuja una caja shadow. La sombra se pintará con la posición, tamaño, color, desenfoque, etc. establecidos en shadow. No es necesario llamar a beginPath() antes de este método.

Nota: Para ver visualmente el área cubierta por drawBoxShadow(), establezca la variable de entorno 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();

Véase también QCanvasBoxShadow.

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

Dibuja image en x, y, a su tamaño por defecto.

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

Véase también addImage().

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

Dibuja image en la posición y tamaño de destinationRect.

Esta es una función sobrecargada.

Véase también addImage().

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

Dibuja image en la posición y tamaño de destinationRect, desde el área sourceRect de la imagen.

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);

Esta es una función sobrecargada.

Véase también addImage().

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

Dibuja image en x, y, en width y height dados.

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

Se trata de una función sobrecargada.

Véase también addImage().

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

Crea una nueva sub-ruta en forma de elipse en ( centerX, centerY) con radiusX y radiusY.

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

void QCanvasPainter::ellipse(const QRectF &rect)

Crea una nueva sub-ruta en forma de elipse en rect. Esta elipse cubrirá el área de rect.

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

Se trata de una función sobrecargada.

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

Crea un nuevo subcamino en forma de elipse en centerPoint con radiusX y radiusY.

Se trata de una función sobrecargada.

void QCanvasPainter::fill()

Rellena la ruta actual con el estilo de relleno actual.

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

Véase también setFillStyle().

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

Rellena path con el estilo de relleno actual y pertenece a pathGroup. Pintar a través de QCanvasPath es óptimo cuando la ruta contiene más comandos es mayoritariamente estática. Por defecto, pathGroup es 0, por lo que utiliza el primer grupo. Cuando pathGroup es -1, la ruta no será cacheada en la GPU. Más información sobre el uso de grupos de caché de rutas en la documentación de QCanvasPath. No es necesario llamar a beginPath() antes de este método.

// 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);

Se trata de una función sobrecargada.

Véase también setFillStyle().

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

Dibuja un rectángulo relleno en la posición especificada ( x, y) al tamaño width, height.

Nota: Esto se proporciona por conveniencia. Cuando rellene más de un rectángulo, prefiera utilizar 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)

Dibuja un rectángulo relleno en rect. Este es un método sobrecargado que utiliza QRectF.

Nota: Esto se proporciona por conveniencia. Cuando rellene más de un rectángulo, prefiera usar rect().

Esta es una función sobrecargada.

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

Dibuja la cadena text en la ubicación especificada ( x, y), con textAlign y textBaseline actuales. Para que el texto se envuelva en varias líneas, establezca el parámetro opcional maxWidth al ancho de fila preferido en píxeles. Los espacios en blanco se eliminan al principio de las filas, el texto se divide en los límites de palabra o cuando se encuentran caracteres de nueva línea. Las palabras más largas que la anchura máxima se dividen por el carácter más cercano (es decir, sin separación por sílabas).

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

Dibuja la cadena text dentro de rect, con textAlign y textBaseline actuales. La anchura del parámetro rect se utiliza como maxWidth.

Este es un método sobrecargado que utiliza QRectF. A menudo es útil establecer la línea de base del texto en TextBaseline::Top o TextBaseline::Middle cuando se pinta texto con este método.

Esta es una función sobrecargada.

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

Dibuja la cadena text en la dirección point especificada, con las opciones actuales textAlign y textBaseline. Para que el texto se envuelva en varias líneas, establezca el parámetro opcional maxWidth con el ancho de fila preferido en píxeles. Los espacios en blanco se eliminan al principio de las filas, el texto se divide en los límites de palabra o cuando se encuentran caracteres de nueva línea. Las palabras más largas que la anchura máxima se dividen por el carácter más cercano (es decir, sin separación por sílabas).

Se trata de un método sobrecargado que utiliza QPointF.

Se trata de una función sobrecargada.

QTransform QCanvasPainter::getTransform() const

Devuelve la transformación actual.

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

Añade un segmento de línea desde el último punto de la ruta hasta el punto ( x, y).

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

void QCanvasPainter::lineTo(QPointF point)

Añade un segmento de línea desde el último punto de la ruta hasta point.

Se trata de una función sobrecargada.

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

Método auxiliar estático para convertir milímetros mm en píxeles. Esto permite hacer dibujos independientes de la resolución. Por ejemplo para establecer el ancho de linea a 2mm usa:

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

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

Inicia una nueva sub-ruta con ( x, y) como primer punto.

void QCanvasPainter::moveTo(QPointF point)

Inicia una nueva sub-ruta con point como primer punto.

Se trata de una función sobrecargada.

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

Método de ayuda estático para convertir puntos pt en píxeles.

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

Añade un segmento bezier cuadrático desde el último punto de la trayectoria a través de un punto de control (cpX, cpY) hasta el punto especificado (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)

Añade un segmento de curva cuadrática desde el último punto de la trayectoria a través de controlPoint hasta el punto especificado endPoint.

Se trata de una función sobrecargada.

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

Crea una nueva sub-ruta en forma de rectángulo en la posición x, y con el tamaño width, height.

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

void QCanvasPainter::rect(const QRectF &rect)

Crea una nueva sub-ruta en forma de rectángulo en rect. Este es un método sobrecargado que utiliza QRectF.

Se trata de una función sobrecargada.

void QCanvasPainter::removeImage(const QCanvasImage &image)

Libera los recursos asociados a image y elimina la imagen del pintor.

Nota: Esto no necesita ser llamado normalmente, porque los recursos como las texturas se liberan en el destructor del pintor de todos modos. Esta función es útil cuando es necesario reducir el uso de memoria debido a que se tienen muchas imágenes, y algunas de ellas ya no se utilizan.

Nota : Las imágenes eliminadas ya no se pueden utilizar en operaciones de pintado.

Nota: Es posible que recursos como las texturas creadas con la API 3D subyacente no se liberen inmediatamente. Tales operaciones pueden ser diferidas a fotogramas posteriores, típicamente cuando este QCanvasPainter comience a pintar de nuevo después de que el conjunto activo de llamadas a dibujar haya sido enviado.

Véase también addImage().

void QCanvasPainter::removePathGroup(int pathGroup)

Elimina pathGroup de la caché del pintor. Si se llama a fill() o stroke() para pathGroup después de esto, se regenerará la ruta en la caché del grupo.

Nota: Esto no necesita ser llamado normalmente ya que las rutas son eliminadas en el destructor del pintor. Utilícelo únicamente para reducir el uso de memoria cuando pathGroup ya no sea necesario o, por ejemplo, cuando la ruta tenga muchos menos comandos que en el pasado y deba reducirse el tamaño del búfer.

Véase también fill() y stroke().

QCanvasPainter::RenderHints QCanvasPainter::renderHints() const

Devuelve una bandera que especifica los consejos de renderizado que se han establecido para este pintor.

Véase también setRenderHints() y setRenderHint().

void QCanvasPainter::reset()

Restablece el estado actual del pintor a los valores por defecto.

Nota: Este método difiere del método HTML canvas 2D context reset() en que no borra visualmente los buffers del lienzo.

// 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);

Véase también save() y restore().

void QCanvasPainter::resetClipping()

Restablece y desactiva el recorte.

Véase también setClipRect().

void QCanvasPainter::resetTransform()

Restablece la transformación actual a una matriz de identidad.

void QCanvasPainter::restore()

Revienta y restaura el estado de renderizado actual. Así que el estado previamente guardado será restaurado. Si no se ha llamado a save() y la pila de estado está vacía, la llamada no hace nada.

Véase también save().

void QCanvasPainter::rotate(float angle)

Gira el sistema de coordenadas actual en el sentido de las agujas del reloj en angle.

El ángulo se especifica en radianes. Utilice qDegreesToRadians() para convertir de grados a radianes.

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)

Crea una nueva sub-ruta en forma de rectángulo redondeado en la posición x, y con el tamaño width, height. El redondeo de las esquinas será radius.

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

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

Crea una nueva subtrayectoria en forma de rectángulo redondeado en rect con las esquinas de radius. Este es un método sobrecargado que utiliza QRectF.

Esta es una función sobrecargada.

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

Crea una nueva sub-ruta en forma de rectángulo redondeado en rect. El redondeo de las esquinas puede variar por esquina, con radiusTopLeft, radiusTopRight, radiusBottomRight, radiusBottomLeft.

Se trata de una función sobrecargada.

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

Crea una nueva sub-ruta en forma de rectángulo redondeado en la posición x, y con el tamaño width, height. El redondeo de las esquinas puede variar por esquina, con radiusTopLeft, radiusTopRight, radiusBottomRight, radiusBottomLeft.

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

Se trata de una función sobrecargada.

void QCanvasPainter::save()

Empuja y guarda el estado de renderizado actual en una pila de estados. Para restaurar el estado se debe utilizar un restore() coincidente.

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);

Véase también restore().

void QCanvasPainter::scale(float scale)

Escala el sistema de coordenadas actual en scale. Las coordenadas x e y se escalan uniformemente.

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)

Escala el sistema de coordenadas actual en scaleX y scaleY.

Se trata de una función sobrecargada.

void QCanvasPainter::setAntialias(float antialias)

Establece la cantidad de antialiasing actual en antialias en píxeles. Más antialias significa una pintura más suave. Esto sólo afecta a la pintura de relleno y trazo, no a imágenes o textos. El valor por defecto es 1.0 y el valor máximo es 10.0.

El antialiasing puede modificarse por ruta, de modo que puede establecerse antes de cada trazo/relleno. Para desactivar el antialiasing de todo el lienzo pintado, utilice 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();
}

Ver también setRenderHints() y setTextAntialias().

void QCanvasPainter::setBrushTransform(const QTransform &transform)

Establece la transformación actual del pincel en transform. Esta transformación se aplica tanto a los pinceles de trazo como a los de relleno.

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

Establece el rectángulo de tijera actual en (x, y, width, height). El rectángulo de tijera es transformado por la transformación actual.

Nota: El recorte tiene un coste de rendimiento y sólo debe utilizarse cuando sea necesario.

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);

Véase también resetClipping().

void QCanvasPainter::setClipRect(const QRectF &rect)

Establece el rectángulo de tijera actual en rect. El rectángulo de tijera es transformado por la transformación actual.

Nota: El recorte tiene un coste de rendimiento y sólo debe utilizarse cuando sea necesario.

Esta es una función sobrecargada.

Véase también resetClipping().

void QCanvasPainter::setFillStyle(const QColor &color)

Establece el estilo de relleno en un sólido color. El estilo de relleno por defecto es el color negro sólido (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)

Establece el estilo de relleno en brush. El estilo de relleno por defecto es el color negro sólido (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);

Esta es una función sobrecargada.

void QCanvasPainter::setFont(const QFont &font)

Establece font como fuente activa.

void QCanvasPainter::setGlobalAlpha(float alpha)

Establece el valor alfa global (transparencia) en alpha. Este valor alfa se aplica a todas las formas renderizadas. Los trazados ya transparentes serán proporcionalmente más transparentes. Alfa debe estar entre 0.0 (totalmente transparente) y 1.0 (totalmente opaco). Por defecto alfa es 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)

Establece el brillo global en value. Este brillo se aplica a todas las formas renderizadas. Un valor de 0 hará que la pintura sea completamente negra. El valor también puede ser mayor que 1.0, para aumentar el brillo. Por defecto, el brillo es 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)

Establece el modo de operación compuesto global en operation. Este modo se aplica a todas las operaciones de pintura. El modo por defecto es QCanvasPainter::CompositeOperation::SourceOver.

void QCanvasPainter::setGlobalContrast(float value)

Establece el contraste global en value. Este contraste se aplica a todas las formas renderizadas. Un valor de 0 hará que la pintura sea completamente gris (0.5, 0.5, 0.5). El valor también puede ser mayor que 1.0, para aumentar el contraste. Por defecto, el contraste es 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)

Establece la saturación global en value. Esta saturación se aplica a todas las formas renderizadas. Un valor de 0 desactivará la saturación y hará que la pintura sea completamente en escala de grises. El valor también puede ser mayor que 1.0, para aumentar la saturación. Por defecto, la saturación es 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)

Fija el final de la línea de stoke en cap. El tope de línea por defecto es 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)

Establece la línea de unión del trazo en join. La línea de unión por defecto es 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);

Véase también setMiterLimit().

void QCanvasPainter::setLineWidth(float width)

Establece el ancho de línea del trazo en width en píxeles. El ancho de línea por defecto es 1.0. Cuando el antialiasing está activado, los anchos de línea por debajo de un solo píxel desvanecen automáticamente la opacidad, creando una salida suave.

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();
}

Véase también stroke().

void QCanvasPainter::setMiterLimit(float limit)

Establece el límite de inglete en limit. El límite de inglete controla cuándo se bisela una esquina afilada. Cuando la longitud de la esquina sea mayor que este límite, en su lugar se aplicará QCanvasPainter::LineJoin::Bevel entre las líneas. Esto sólo tiene efecto con la unión de líneas QCanvasPainter::LineJoin::Miter. El límite por defecto es 10.0.

Véase también setLineJoin().

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

Establece la subtrayectoria actual winding en CounterClockWise (por defecto) o ClockWise. CounterClockWise dibuja subtrayectorias sólidas mientras que ClockWise dibuja agujeros.

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();

Véase también beginHoleSubPath() y beginSolidSubPath().

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

Establece la representación hint en el pintor si on es verdadero; en caso contrario, borra la sugerencia de representación.

Véase también setRenderHints() y renderHints().

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

Establece la representación hints en el pintor si on es verdadero; en caso contrario, borra las sugerencias de representación.

Véase también setRenderHint() y renderHints().

void QCanvasPainter::setStrokeStyle(const QColor &color)

Establece el estilo de trazo en un sólido color. El estilo de trazo por defecto es de color negro sólido (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)

Establece el estilo de trazo en brush. El estilo de trazo por defecto es el color negro sólido (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);

Esta es una función sobrecargada.

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

Establece la alineación horizontal del texto en align. La alineación por defecto es 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);

Véase también setTextBaseline().

void QCanvasPainter::setTextAntialias(float antialias)

Establece la cantidad actual de antialiasing del texto. El valor antialias es el multiplicador del antialiasing normal, lo que significa que 0.0 desactiva el antialiasing y 2.0 lo duplica. El valor por defecto es 1.0.

Nota: Debido a la técnica de antialiasing de texto utilizada (SDF), la cantidad máxima de antialiasing es bastante limitada y esto afecta menos cuando el tamaño de la fuente es pequeño.

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)

Establece la alineación vertical (línea de base) del texto en baseline. La alineación por defecto es 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);

Véase también setTextAlign().

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

Establece la dirección del texto en direction. La dirección por defecto es QCanvasPainter::TextDirection::Inherit.

void QCanvasPainter::setTextLineHeight(float height)

Establece el ajuste de la altura de línea en píxeles en height para el texto envuelto. La altura de línea por defecto es 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)

Establece el modo de ajuste del texto en wrapMode. El modo de ajuste por defecto es 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)

Restablece la transformación actual y utiliza transform en su lugar.

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();

Véase también transform().

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

Inclina (cizalla) el sistema de coordenadas actual a lo largo del eje X en angleX y a lo largo del eje Y en angleY. Los ángulos se especifican en radianes.

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()

Traza la ruta actual con el estilo de trazo actual.

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

Véase también setStrokeStyle().

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

Pinta el path con el estilo de trazo actual y perteneciente a pathGroup. Pintar a través de QCanvasPath es óptimo cuando la ruta contiene más comandos es mayoritariamente estática. Por defecto, pathGroup es 0, por lo que utiliza el primer grupo. Cuando pathGroup es -1, la ruta no será cacheada en la GPU. Más información sobre el uso de grupos de caché de rutas en la documentación de QCanvasPath. No es necesario llamar a beginPath() antes de este método.

// 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);

Se trata de una función sobrecargada.

Véase también setStrokeStyle().

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

Dibuja un rectángulo en la posición especificada ( x, y) con el tamaño width, height.

Nota: Esto se proporciona por conveniencia. Para dibujar más de un rectángulo, es preferible utilizar 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)

Dibuja un rectángulo stoked en rect. Este es un método sobrecargado que utiliza QRectF.

Nota: Esto se proporciona por conveniencia. Para dibujar más de un rectángulo, es preferible utilizar rect().

Esta es una función sobrecargada.

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

Mide el cuadro delimitador de una cadena text en (x, y). Para medir texto de varias líneas, establezca el parámetro opcional maxWidth en el ancho de fila preferido en píxeles. Devuelve QRectF con los valores [xmin, ymin, width, height]. Los valores medidos se devuelven en el espacio de coordenadas local.

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)

Mide el cuadro delimitador de una cadena text en rect. Devuelve QRectF con valores [xmin, ymin, width, height]. Los valores medidos se devuelven en el espacio de coordenadas local.

Se trata de una función sobrecargada.

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

Mide el cuadro delimitador de una cadena text en point. Para medir texto de varias líneas, establezca el parámetro opcional maxWidth en el ancho de fila preferido en píxeles. Devuelve QRectF con los valores [xmin, ymin, width, height]. Los valores medidos se devuelven en el espacio de coordenadas local.

Se trata de una función sobrecargada.

void QCanvasPainter::transform(const QTransform &transform)

Multiplica el sistema de coordenadas actual por 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();
}

Véase también setTransform().

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

Traslada el sistema de coordenadas actual en x y 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)

Traduce el sistema de coordenadas actual en point.

Se trata de una función sobrecargada.

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