本页内容

QPainter Class

QPainter 类负责对小部件和其他绘制设备执行低级绘制操作。更多内容...

标题: #include <QPainter>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui
由以下项目继承:

QStylePainter

注意:该类中的所有函数均为可重入的。

公共类型

class PixmapFragment
enum CompositionMode { CompositionMode_SourceOver, CompositionMode_DestinationOver, CompositionMode_Clear, CompositionMode_Source, CompositionMode_Destination, …, RasterOp_SourceOrNotDestination }
enum PixmapFragmentHint { OpaqueHint }
flags PixmapFragmentHints
enum RenderHint { Antialiasing, TextAntialiasing, SmoothPixmapTransform, VerticalSubpixelPositioning, LosslessImageRendering, NonCosmeticBrushPatterns }
flags RenderHints

公共函数

QPainter()
QPainter(QPaintDevice*device)
~QPainter()
const QBrush &background() const
Qt::BGMode backgroundMode() const
bool begin(QPaintDevice*device)
void beginNativePainting()
QRectF boundingRect(const QRectF&rectangle, intflags, const QString&text)
QRect boundingRect(const QRect&rectangle, intflags, const QString&text)
QRectF boundingRect(const QRectF&rectangle, const QString&text, const QTextOption&option= QTextOption())
QRect boundingRect(intx, inty, intw, inth, intflags, const QString&text)
const QBrush &brush() const
QPoint brushOrigin() const
(since 6.11) QPointF brushOriginF() const
QRectF clipBoundingRect() const
QPainterPath clipPath() const
QRegion clipRegion() const
QTransform combinedTransform() const
QPainter::CompositionMode compositionMode() const
QPaintDevice *device() const
const QTransform &deviceTransform() const
void drawArc(const QRectF&rectangle, intstartAngle, intspanAngle)
void drawArc(const QRect&rectangle, intstartAngle, intspanAngle)
void drawArc(intx, inty, intwidth, intheight, intstartAngle, intspanAngle)
void drawChord(const QRectF&rectangle, intstartAngle, intspanAngle)
void drawChord(const QRect&rectangle, intstartAngle, intspanAngle)
void drawChord(intx, inty, intwidth, intheight, intstartAngle, intspanAngle)
void drawConvexPolygon(const QPointF*points, intpointCount)
void drawConvexPolygon(const QPolygon&polygon)
void drawConvexPolygon(const QPolygonF&polygon)
void drawConvexPolygon(const QPoint*points, intpointCount)
void drawEllipse(const QRectF&rectangle)
void drawEllipse(const QRect&rectangle)
void drawEllipse(const QPoint&center, intrx, intry)
void drawEllipse(const QPointF&center, qrealrx, qrealry)
void drawEllipse(intx, inty, intwidth, intheight)
void drawGlyphRun(const QPointF&position, const QGlyphRun&glyphs)
void drawImage(const QRectF&target, const QImage&image, const QRectF&source, Qt::ImageConversionFlagsflags= Qt::AutoColor)
void drawImage(const QPoint&point, const QImage&image)
void drawImage(const QPointF&point, const QImage&image)
void drawImage(const QRect&rectangle, const QImage&image)
void drawImage(const QRectF&rectangle, const QImage&image)
void drawImage(const QPoint&point, const QImage&image, const QRect&source, Qt::ImageConversionFlagsflags= Qt::AutoColor)
void drawImage(const QPointF&point, const QImage&image, const QRectF&source, Qt::ImageConversionFlagsflags= Qt::AutoColor)
void drawImage(const QRect&target, const QImage&image, const QRect&source, Qt::ImageConversionFlagsflags= Qt::AutoColor)
void drawImage(intx, inty, const QImage&image, intsx= 0, intsy= 0, intsw= -1, intsh= -1, Qt::ImageConversionFlagsflags= Qt::AutoColor)
void drawLine(const QLineF&line)
void drawLine(const QLine&line)
void drawLine(const QPoint&p1, const QPoint&p2)
void drawLine(const QPointF&p1, const QPointF&p2)
void drawLine(intx1, inty1, intx2, inty2)
void drawLines(const QLineF*lines, intlineCount)
void drawLines(const QList<QLine>&lines)
void drawLines(const QList<QLineF>&lines)
void drawLines(const QList<QPoint>&pointPairs)
void drawLines(const QList<QPointF>&pointPairs)
void drawLines(const QLine*lines, intlineCount)
void drawLines(const QPoint*点对, int线数)
void drawLines(const QPointF*pointPairs, intlineCount)
void drawPath(const QPainterPath&path)
void drawPicture(const QPointF&point, const QPicture&picture)
void drawPicture(const QPoint&point, const QPicture&picture)
void drawPicture(intx, inty, const QPicture&picture)
void drawPie(const QRectF&rectangle, intstartAngle, intspanAngle)
void drawPie(const QRect&rectangle, intstartAngle, intspanAngle)
void drawPie(intx, inty, intwidth, intheight, intstartAngle, intspanAngle)
void drawPixmap(const QRectF&target, const QPixmap&pixmap, const QRectF&source)
void drawPixmap(const QPoint&point, const QPixmap&pixmap)
void drawPixmap(const QPointF&point, const QPixmap&pixmap)
void drawPixmap(const QRect&rectangle, const QPixmap&pixmap)
void drawPixmap(const QPoint&point, const QPixmap&pixmap, const QRect&source)
void drawPixmap(const QPointF&point, const QPixmap&pixmap, const QRectF&source)
void drawPixmap(const QRect&target, const QPixmap&pixmap, const QRect&source)
void drawPixmap(intx, inty, const QPixmap&pixmap)
void drawPixmap(intx, inty, intwidth, intheight, const QPixmap&pixmap)
void drawPixmap(intx, inty, const QPixmap&pixmap, intsx, intsy, intsw, intsh)
void drawPixmap(intx, inty, intw, inth, const QPixmap&pixmap, intsx, intsy, intsw, intsh)
void drawPixmapFragments(const QPainter::PixmapFragment*fragments, intfragmentCount, const QPixmap&pixmap, QPainter::PixmapFragmentHintshints= PixmapFragmentHints())
void drawPoint(const QPointF&position)
void drawPoint(const QPoint&position)
void drawPoint(intx, inty)
void drawPoints(const QPointF*points, intpointCount)
void drawPoints(const QPolygon&points)
void drawPoints(const QPolygonF&points)
void drawPoints(const QPoint*points, intpointCount)
void drawPolygon(const QPointF*points, intpointCount, Qt::FillRulefillRule= Qt::OddEvenFill)
void drawPolygon(const QPolygon&points, Qt::FillRulefillRule= Qt::OddEvenFill)
void drawPolygon(const QPolygonF&points, Qt::FillRulefillRule= Qt::OddEvenFill)
void drawPolygon(const QPoint*points, intpointCount, Qt::FillRulefillRule= Qt::OddEvenFill)
void drawPolyline(const QPointF*points, intpointCount)
void drawPolyline(const QPolygon&points)
void drawPolyline(const QPolygonF&points)
void drawPolyline(const QPoint*points, intpointCount)
void drawRect(const QRectF&rectangle)
void drawRect(const QRect&rectangle)
void drawRect(intx, inty, intwidth, intheight)
void drawRects(const QRectF*rectangles, intrectCount)
void drawRects(const QList<QRect>&rectangles)
void drawRects(const QList<QRectF>&rectangles)
void drawRects(const QRect*rectangles, intrectCount)
void drawRoundedRect(const QRectF&rect, qrealxRadius, qrealyRadius, Qt::SizeModemode= Qt::AbsoluteSize)
void drawRoundedRect(const QRect&rect, qrealxRadius, qrealyRadius, Qt::SizeModemode= Qt::AbsoluteSize)
void drawRoundedRect(intx, inty, intw, inth, qrealxRadius, qrealyRadius, Qt::SizeModemode= Qt::AbsoluteSize)
void drawStaticText(const QPointF&topLeftPosition, const QStaticText&staticText)
void drawStaticText(const QPoint&topLeftPosition, const QStaticText&staticText)
void drawStaticText(intleft, inttop, const QStaticText&staticText)
void drawText(const QPointF&position, const QString&text)
void drawText(const QPoint&position, const QString&text)
void drawText(const QRectF&rectangle, const QString&text, const QTextOption&option= QTextOption())
void drawText(intx, inty, const QString&text)
void drawText(const QRect&rectangle, intflags, const QString&text, QRect*boundingRect= nullptr)
void drawText(const QRectF&rectangle, intflags, const QString&text, QRectF*boundingRect= nullptr)
void drawText(intx, inty, intwidth, intheight, intflags, const QString&text, QRect*boundingRect= nullptr)
void drawTiledPixmap(const QRectF&rectangle, const QPixmap&pixmap, const QPointF&position= QPointF())
void drawTiledPixmap(const QRect&rectangle, const QPixmap&pixmap, const QPoint&position= QPoint())
void drawTiledPixmap(intx, inty, intwidth, intheight, const QPixmap&pixmap, intsx= 0, intsy= 0)
bool end()
void endNativePainting()
void eraseRect(const QRectF&rectangle)
void eraseRect(const QRect&rectangle)
void eraseRect(intx, inty, intwidth, intheight)
void fillPath(const QPainterPath&path, const QBrush&brush)
void fillRect(const QRectF&rectangle, const QBrush&brush)
void fillRect(const QRect&rectangle, QGradient::Presetpreset)
void fillRect(const QRect&rectangle, Qt::BrushStylestyle)
void fillRect(const QRect&rectangle, Qt::GlobalColorcolor)
void fillRect(const QRect&rectangle, const QBrush&brush)
void fillRect(const QRect&rectangle, const QColor&color)
void fillRect(const QRectF&rectangle, QGradient::Presetpreset)
void fillRect(const QRectF&rectangle, Qt::BrushStylestyle)
void fillRect(const QRectF&rectangle, Qt::GlobalColorcolor)
void fillRect(const QRectF&rectangle, const QColor&color)
void fillRect(intx, inty, intwidth, intheight, QGradient::Presetpreset)
void fillRect(intx, inty, intwidth, intheight, Qt::BrushStylestyle)
void fillRect(intx, inty, intwidth, intheight, Qt::GlobalColorcolor)
void fillRect(intx, inty, intwidth, intheight, const QBrush&brush)
void fillRect(intx, inty, intwidth, intheight, const QColor&color)
const QFont &font() const
QFontInfo fontInfo() const
QFontMetrics fontMetrics() const
bool hasClipping() const
bool isActive() const
Qt::LayoutDirection layoutDirection() const
qreal opacity() const
QPaintEngine *paintEngine() const
const QPen &pen() const
QPainter::RenderHints renderHints() const
void resetTransform()
void restore()
void rotate(qrealangle)
void save()
void scale(qrealsx, qrealsy)
void setBackground(const QBrush&brush)
void setBackgroundMode(Qt::BGMode模式)
void setBrush(const QBrush&brush)
(since 6.11) void setBrush(QBrush&&brush)
(since 6.9) void setBrush(QColorcolor)
void setBrush(Qt::BrushStylestyle)
(since 6.9) void setBrush(Qt::GlobalColor颜色)
void setBrushOrigin(const QPointF&position)
void setBrushOrigin(const QPoint&position)
void setBrushOrigin(intx, inty)
void setClipPath(const QPainterPath&path, Qt::ClipOperationoperation= Qt::ReplaceClip)
void setClipRect(const QRectF&rectangle, Qt::ClipOperationoperation= Qt::ReplaceClip)
void setClipRect(intx, inty, intwidth, intheight, Qt::ClipOperationoperation= Qt::ReplaceClip)
void setClipRect(const QRect&rectangle, Qt::ClipOperationoperation= Qt::ReplaceClip)
void setClipRegion(const QRegion&region, Qt::ClipOperationoperation= Qt::ReplaceClip)
void setClipping(boolenable)
void setCompositionMode(QPainter::CompositionModemode)
void setFont(const QFont&font)
void setLayoutDirection(Qt::LayoutDirectiondirection)
void setOpacity(qreal透明度)
void setPen(const QPen&pen)
(since 6.11) void setPen(QPen&&pen)
void setPen(Qt::PenStylestyle)
void setPen(const QColor&color)
void setRenderHint(QPainter::RenderHinthint, boolon= true)
void setRenderHints(QPainter::RenderHintshints, boolon= true)
void setTransform(const QTransform&transform, boolcombine= false)
void setViewTransformEnabled(boolenable)
void setViewport(const QRect&rectangle)
void setViewport(intx, inty, intwidth, intheight)
void setWindow(const QRect&rectangle)
void setWindow(intx, inty, intwidth, intheight)
void setWorldMatrixEnabled(boolenable)
void setWorldTransform(const QTransform&matrix, boolcombine= false)
void shear(qrealsh, qrealsv)
void strokePath(const QPainterPath&path, const QPen&pen)
bool testRenderHint(QPainter::RenderHinthint) const
const QTransform &transform() const
void translate(const QPointF&offset)
void translate(const QPoint&offset)
void translate(qrealdx, qrealdy)
bool viewTransformEnabled() const
QRect viewport() const
QRect window() const
bool worldMatrixEnabled() const
const QTransform &worldTransform() const

详细说明

QPainter 提供了高度优化的函数,可完成大多数 GUI 程序所需的绘图任务。它能够绘制从简单线条到扇形和弦等复杂图形的一切内容,还可以绘制对齐文本和位图。通常,它是在“自然”坐标系中进行绘图的,但也可以进行视图和世界变换。 QPainter 可以操作任何继承自QPaintDevice 类的对象。

QPainter 的常见用法是在控件的 paint 事件中:创建并自定义绘图器(例如设置画笔或笔触),然后进行绘制。请记住,绘制完成后要销毁 QPainter 对象。例如:

void SimpleExampleWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setPen(Qt::blue);
    painter.setFont(QFont("Arial", 30));
    painter.drawText(rect(), Qt::AlignCenter, "Qt");
}

QPainter 的核心功能是绘制,但该类还提供了一些函数,允许您自定义 QPainter 的设置及其渲染质量,还有一些函数可启用裁剪功能。此外,您还可以通过指定绘图器的合成模式来控制不同形状的合并方式。

isActive() 函数用于指示绘图器是否处于活动状态。绘图器可通过begin() 函数以及接受QPaintDevice 参数的构造函数来激活。end() 函数和析构函数则会将其停用。

QPainter 与QPaintDevice 及QPaintEngine 类共同构成了 Qt 绘制系统的基石。QPainter 是用于执行绘制操作的类。QPaintDevice 代表一种可通过 QPainter 进行绘制的设备。QPaintEngine 提供了绘图器用于在不同类型设备上绘制的接口。 如果绘图器处于活动状态,device() 将返回绘图器进行绘制的绘图设备,而paintEngine() 将返回绘图器当前运行的绘图引擎。有关更多信息,请参阅“绘图系统”。

有时,可能需要让其他对象在非标准的QPaintDevice 上进行绘制。QPainter提供了一个静态函数setRedirected()来实现此功能。

警告:当 绘制设备(paintdevice)为小部件时 ,QPainter 只能在 paintEvent() 函数内部或由 paintEvent() 调用的函数中使用。

设置

您可以自定义以下几项设置,使 QPainter 根据您的偏好进行绘制:

请注意,其中一些设置与某些绘图设备(例如QWidget::font())中的设置相对应。QPainter::begin() 函数(或等效的 QPainter 构造函数)会从绘图设备中复制这些属性。

您可以随时通过调用save()函数来保存QPainter的状态,该函数会将所有可用设置保存到内部栈中。restore()函数则会将它们恢复。

绘制

QPainter 提供了用于绘制大多数基元的功能:drawPoint()、drawPoints()、drawLine()、drawRect()、drawRoundedRect()、drawEllipse()、drawArc()、drawPie()、drawChord()、drawPolyline()、drawPolygon()、drawConvexPolygon() 和 drawCubicBezier()。 两个便利函数drawRects() 和drawLines() 会使用当前的笔和画笔,在给定的QRects 或QLines 数组中绘制指定数量的矩形或直线。

QPainter 类还提供了fillRect() 函数,该函数使用给定的QBrush 填充给定的QRect ;以及eraseRect() 函数,该函数擦除给定矩形内的区域。

所有这些函数都有整数版和浮点版。

一款具备形状和画笔选项的基础绘图应用基本绘图示例

“基本绘图”示例演示了如何使用 QPainter 类以多种样式显示基本的图形基元。

如果您需要绘制复杂形状,特别是需要反复绘制时,请考虑创建一个QPainterPath ,并使用drawPath()进行绘制。

Painter Paths 示例

QPainterPath 类提供了一个用于绘制操作的容器,从而能够构建和复用图形形状。

“Painter Paths”示例展示了如何利用绘图路径构建用于渲染的复杂形状。

带有各种形状的“Painter Paths”应用程序

QPainter 还提供了fillPath() 函数,该函数会用给定的QBrush 填充给定的QPainterPath ;以及strokePath() 函数,该函数用于绘制给定路径的轮廓(即对路径进行描边)。

另请参阅“矢量变形”示例,该示例演示了如何使用高级矢量技术通过QPainterPath 绘制文本;“渐变”示例,该示例展示了Qt中可用的不同类型渐变;以及“路径描边”示例,该示例展示了Qt的内置虚线图案,并演示了如何使用自定义图案来扩展可用图案的范围。

文本绘制使用 `drawText()` 实现。当需要精细定位时,`boundingRect()` 会告诉您给定的 `drawText()` 命令将在何处绘制。

绘制位图和图像

有若干函数可用于绘制像素图/图像,即drawPixmap()、drawImage() 和drawTiledPixmap()。drawPixmap() 和drawImage() 产生的结果相同,区别在于drawPixmap() 在屏幕上的渲染速度更快,而drawImage() 在QPrinter 或其他设备上可能运行更快。

有一个drawPicture()函数,用于绘制整个QPicture 的内容。drawPicture()函数是唯一会忽略所有绘图器设置的函数,因为QPicture 拥有自己的设置。

绘制高分辨率版本的位图和图像

像素图的高分辨率版本其设备像素比值大于 1(参见QImageReader ,QPixmap::devicePixelRatio())。如果该值与底层QPaintDevice 的值相匹配,则会直接渲染到设备上,无需进行额外变换。

例如,当将尺寸为 64x64 像素、设备像素比为 2 的QPixmap 绘制到同样具有 2 的设备像素比的高 DPI 屏幕上时,便是这种情况。 请注意,此时该像素图在用户空间中实际上为32x32像素。Qt中基于像素图尺寸计算布局几何形状的代码路径将使用此尺寸。其最终效果是,该像素图将作为高DPI像素图显示,而非大尺寸像素图。

渲染质量

若要使用 QPainter 获得最佳渲染效果,应将平台无关的 `QImage ` 作为绘制设备;即使用 `QImage ` 可确保渲染结果在任何平台上的像素表示都完全一致。

QPainter类还通过其RenderHint 枚举以及对浮点精度的支持,提供了一种控制渲染质量的手段:所有用于绘制基元的功能都提供了浮点版本。

painter.drawEllipse(QRectF(-diameter / 2.0, -diameter / 2.0, diameter, diameter));

这些通常与QPainter::Antialiasing 渲染提示结合使用。

QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
比较使用 int 和 float 类型绘制的同心圆,以及启用或禁用抗锯齿渲染的情况。使用浮点精度版本可生成间距均匀的同心圆环。启用抗锯齿渲染可得到平滑的圆。通过同心圆比较有锯齿和无锯齿的效果

RenderHint 枚举向 QPainter 指定了标志,但具体是否被某个引擎采纳则因引擎而异。QPainter::Antialiasing 表示引擎应在可能的情况下对基元边缘进行抗锯齿处理,QPainter::TextAntialiasing 表示引擎应在可能的情况下对文本进行抗锯齿处理,而QPainter::SmoothPixmapTransform 表示引擎应使用平滑的位图变换算法。

renderHints() 函数返回一个标志,该标志指定了为该绘图器设置的渲染提示。使用setRenderHint() 函数可设置或清除当前设置的RenderHints 。

坐标变换

通常情况下,QPainter 在设备自身的坐标系(通常为像素)中进行操作,但 QPainter 很好地支持坐标变换。

最常用的变换包括缩放、旋转、平移和剪切。使用scale()函数可将坐标系按给定的偏移量进行缩放,使用rotate()函数可将其顺时针旋转,使用translate()函数可对其进行平移(即向各点添加给定的偏移量)。 您还可以使用shear() 函数围绕原点对坐标系进行扭转。请参阅“仿射变换”示例,以直观了解经过剪切的坐标系。

另请参阅“变换”示例,该示例展示了变换如何影响 QPainter 渲染图形基元的方式。特别是,它展示了变换的顺序如何影响最终结果。

仿射变换示例

“仿射变换”示例展示了 Qt 在绘制操作中执行仿射变换的能力。该演示还允许用户尝试各种变换操作,并立即查看结果。

以企鹅图形为例的仿射变换

所有变换操作均基于变换矩阵 `worldTransform()` 进行。矩阵可将平面上的一个点变换为另一个点。有关变换矩阵的更多信息,请参阅《坐标系》和《QTransform 》文档。

setWorldTransform() 函数可替换或补充当前设置的worldTransform()。resetTransform() 函数可重置使用translate()、scale()、shear()、rotate()、setWorldTransform()、setViewport() 和setWindow() 函数所进行的任何变换。deviceTransform() 函数返回将逻辑坐标转换为平台相关绘图设备的设备坐标的矩阵。 仅当在平台相关的句柄上使用平台绘制命令,且该平台本身不支持原生变换时,才需要使用后者函数。

使用 QPainter 绘制时,我们使用逻辑坐标指定点,这些坐标随后会被转换为绘图设备的物理坐标。 逻辑坐标到物理坐标的映射由 QPainter 的combinedTransform() 处理,该函数结合了viewport()、window() 和worldTransform()。viewport() 表示指定任意矩形的物理坐标,window() 描述逻辑坐标中的同一矩形,而worldTransform() 与变换矩阵相同。

另请参阅“坐标系”

裁剪

QPainter 可以将任何绘图操作裁剪到矩形、区域或矢量路径内。 可通过函数clipRegion()和clipPath()获取当前裁剪设置。是优先使用路径还是区域(速度更快)取决于底层的paintEngine()。例如,QImage 绘图引擎优先使用路径,而X11绘图引擎则优先使用区域。裁剪设置是在绘图器的逻辑坐标系中进行的。

在 QPainter 进行裁剪之后,绘制设备也可能进行裁剪。例如,大多数小部件会裁剪掉子小部件占用的像素,而大多数打印机也会裁剪掉纸张边缘附近的区域。这种额外的裁剪不会体现在clipRegion() 或hasClipping() 的返回值中。

合成模式

QPainter 提供了CompositionMode 枚举,该枚举定义了数字图像合成中的 Porter-Duff 规则;它描述了一种将一张图像(源图像)中的像素与另一张图像(目标图像)中的像素进行组合的模型。

最常见的两种合成形式是Source 和SourceOver 。Source 用于将不透明对象绘制到绘图设备上。在此模式下,源图像中的每个像素都会替换目标图像中的对应像素。在SourceOver 合成模式下,源对象是透明的,并绘制在目标图像之上。

请注意,合成变换是按像素进行的。 因此,使用图形基元本身与其边界矩形之间存在差异:边界矩形包含 alpha == 0 的像素(即包围基元的像素)。这些像素会覆盖其他图像的像素,从而实际上清除了这些像素,而基元仅覆盖其自身的区域。

结合混合图像的构图模式示例合成模式示例

Qt 的示例目录中提供了“合成模式”示例,您可以借此尝试各种合成模式,并立即查看结果。

限制

如果您在Qt的基于光栅的绘制引擎中使用坐标,请务必注意:虽然可以使用大于±215的坐标,但超出此范围的任何绘制操作均无法保证显示;绘制内容可能会被裁剪。这是由于实现中使用了short int 所致。

在处理曲线形状时,Qt 的描边器生成的轮廓仅为近似值。在大多数情况下,无法使用另一个贝塞尔曲线段来表示贝塞尔曲线段的轮廓,因此 Qt 通过使用多个较小的曲线来近似曲线轮廓。 出于性能考虑,Qt XML 生成的轮廓所使用的曲线数量存在上限,因此当使用较大的笔宽或缩放比例时,轮廓误差会增加。若要生成误差较小的轮廓,可以使用QPainterPathStroker 类,该类具有 setCurveThreshold 成员函数,允许用户指定误差容限。 另一种变通方法是先将路径转换为多边形,然后绘制这些多边形。

同样地,Qt 也会使用三次贝塞尔曲线来近似弧线和椭圆,而不是通过三角函数进行计算,因此弧线上的点会略微偏离其真实位置。 与此相关的是,drawArc()、drawPie() 和drawChord() 所采用的角度均为偏心角:只有当边界矩形为正方形时,这些角度才表示从该矩形中心出发的方向。有关这两者的详细信息,请参阅Arcs and Ellipses 。

性能

QPainter 是一个功能丰富的框架,允许开发者执行多种图形操作,例如渐变、合成模式和矢量图形。而且 QPainter 能够在各种不同的硬件和软件堆栈上实现这些功能。 当然,底层的软硬件组合会对性能产生一定影响;而要确保每一项操作在与各种合成模式、画笔、裁剪、变换等的组合下都保持快速,由于排列组合的数量庞大,这几乎是一项不可能完成的任务。 作为折中方案,我们选取了 QPainter API 和后端功能的一组子集,确保在给定的软硬件组合下,其性能能达到我们所能合理实现的最佳水平。

我们重点关注的高性能引擎后端包括:

  • Raster - 该后端完全通过软件实现所有渲染,始终用于渲染到 QImages 中。为获得最佳性能,请仅使用格式类型QImage::Format_ARGB32_Premultiplied 、QImage::Format_RGB32 或QImage::Format_RGB16 。任何其他格式(包括QImage::Format_ARGB32 )的性能都会显著下降。该引擎默认用于QWidget 和QPixmap 。
  • OpenGL 2.0 (ES) —— 该后端是硬件加速图形处理的主要后端。它可在支持 OpenGL 2.0 或 OpenGL/ES 2.0 规范的桌面计算机和嵌入式设备上运行。这包括近几年生产的大多数图形芯片。 通过在 `QOpenGLWidget` 上使用 `QPainter` 即可启用该引擎。

这些操作包括:

  • 简单变换,即平移和缩放,以及0、90、180、270度的旋转。
  • drawPixmap() 结合简单变换和不透明度,采用非平滑变换模式(未启用QPainter::SmoothPixmapTransform 作为渲染提示)。
  • 使用纯色、双色线性渐变以及简单变换填充的矩形。
  • 带有简单变换和“交集裁剪”功能的矩形裁剪。
  • 合成模式:QPainter::CompositionMode_Source 和QPainter::CompositionMode_SourceOver 。
  • 使用纯色和双色线性渐变填充的圆角矩形。
  • 通过qDrawBorderPixmap 实现的3x3补丁式像素图。

此列表指明了在性能至关重要的应用程序中,哪些功能可安全使用。对于某些配置,其他操作可能同样快速,但在广泛使用它们之前,建议在软件最终运行的系统上进行基准测试并加以验证。 此外,在某些情况下,使用开销较大的操作也是可行的,例如当结果被缓存到QPixmap 中时。

另请参阅 QPaintDevice 、QPaintEngine 、 Qt SVG、基本绘图示例以及Drawing Utility Functions 。

成员类型文档

enum QPainter::CompositionMode

定义了数字图像合成所支持的模式。合成模式用于指定一张图像(源图像)中的像素如何与另一张图像(目标图像)中的像素进行合并。

请注意,以 RasterOp 为前缀的位级光栅操作模式仅在 X11 和光栅绘图引擎中原生支持。这意味着在 Mac 上使用这些模式的唯一方法是通过QImage 。带有透明度成分的笔和画笔不支持以 RasterOp 命名的混合模式。 此外,启用“QPainter::Antialiasing ”渲染提示将有效禁用 RasterOp 模式。

展示“源”、“目标”、“源叠加”、“目标叠加”、“源内”和“目标内”合成模式的示意图

展示 SourceOut、DestinationOut、SourceAtop、DestinationAtop、Clear 和 Xor 合成模式的示意图

最常见的类型是 SourceOver(通常简称为 alpha 混合),在此模式下,源像素会叠加在目标像素之上,源像素的 alpha 成分决定了目标像素的半透明度。

某些合成模式需要源图像或目标图像中包含 alpha 通道才能生效。为了获得最佳性能,建议使用Format_ARGB32_Premultiplied 图像格式。

设置合成模式后,该模式将应用于所有绘图运算符、画笔、渐变以及位图/图像绘制。

常量值描述
QPainter::CompositionMode_SourceOver0这是默认模式。使用源图像的透明度将像素与目标图像进行混合。
QPainter::CompositionMode_DestinationOver1使用目标的透明度将像素与源像素进行混合。此模式是 CompositionMode_SourceOver 的反向模式。
QPainter::CompositionMode_Clear2目标区域中的像素将被清空(设置为完全透明),与源区域无关。
QPainter::CompositionMode_Source3输出结果为源像素。(这意味着一个基本的复制操作,当源像素不透明时,该模式与 SourceOver 完全相同)。
QPainter::CompositionMode_Destination4输出为目标像素。这意味着混合操作没有效果。此模式与 CompositionMode_Source 相反。
QPainter::CompositionMode_SourceIn5输出结果为源像素,其透明度(alpha)会减去目标像素的透明度。
QPainter::CompositionMode_DestinationIn6输出为目标像素,其透明度(alpha)会减去源像素的透明度。此模式与 CompositionMode_SourceIn 相反。
QPainter::CompositionMode_SourceOut7输出为源像素,其透明度减去目标像素透明度的倒数。
QPainter::CompositionMode_DestinationOut8输出为目标像素,其透明度(alpha)被源像素的透明度(alpha)的倒数减去。该模式是 CompositionMode_SourceOut 的逆模式。
QPainter::CompositionMode_SourceAtop9源像素被混合到目标像素之上,源像素的透明度减去目标像素的透明度。
QPainter::CompositionMode_DestinationAtop10目标像素叠加在源像素之上,目标像素的透明度由目标像素的透明度减去。该模式是 CompositionMode_SourceAtop 的逆模式。
QPainter::CompositionMode_Xor11源像素的透明度会根据目标像素透明度的倒数进行降低,并与目标像素合并,而目标像素的透明度则会根据源像素透明度的倒数进行降低。CompositionMode_Xor 与位运算中的异或 (XOR) 不同。
QPainter::CompositionMode_Plus12源像素和目标像素的透明度和颜色均被相加。
QPainter::CompositionMode_Multiply13输出结果是源颜色与目标颜色的乘积。颜色与白色相乘后保持不变,而与黑色相乘则产生黑色。
QPainter::CompositionMode_Screen14源和目标颜色先被反转,然后进行乘法运算。用白色对颜色进行叠加会产生白色,而用黑色对颜色进行叠加则不会改变该颜色。
QPainter::CompositionMode_Overlay15根据目标颜色对颜色进行乘法运算或叠加运算。目标颜色与源颜色混合,以反映目标颜色的明暗程度。
QPainter::CompositionMode_Darken16选择源色和目标色中较暗的一方。
QPainter::CompositionMode_Lighten17选择源色和目标色中较浅的那个。
QPainter::CompositionMode_ColorDodge18目标颜色被提亮以反映源颜色。黑色源颜色会使目标颜色保持不变。
QPainter::CompositionMode_ColorBurn19目标颜色被加深以反映源颜色。当源颜色为白色时,目标颜色保持不变。
QPainter::CompositionMode_HardLight20根据源颜色对颜色进行乘法混合或加法混合。浅色的源颜色会使目标颜色变亮,而深色的源颜色会使目标颜色变暗。
QPainter::CompositionMode_SoftLight21根据源颜色使颜色变暗或变亮。类似于 CompositionMode_HardLight。
QPainter::CompositionMode_Difference22从较浅的颜色中减去较深的颜色。使用白色绘制会反转目标颜色,而使用黑色绘制则保持目标颜色不变。
QPainter::CompositionMode_Exclusion23与 CompositionMode_Difference 类似,但对比度较低。使用白色绘制会反转目标颜色,而使用黑色绘制则保持目标颜色不变。
QPainter::RasterOp_SourceOrDestination24对源像素和目标像素执行位或(OR)运算(src OR dst)。
QPainter::RasterOp_SourceAndDestination25对源像素和目标像素执行位与运算 (src AND dst)。
QPainter::RasterOp_SourceXorDestination26对源像素和目标像素执行位异或 (XOR) 运算 (src XOR dst)。
QPainter::RasterOp_NotSourceAndNotDestination27对源像素和目标像素执行位运算 NOR 操作 ((NOT src) AND (NOT dst))。
QPainter::RasterOp_NotSourceOrNotDestination28对源像素和目标像素执行位运算“非或”((NOT src) OR (NOT dst))。
QPainter::RasterOp_NotSourceXorDestination29执行一位运算,先对源像素进行反相,然后与目标像素进行异或运算 ((NOT src) XOR dst)。
QPainter::RasterOp_NotSource30执行位运算,将源像素反转(NOT src)。
QPainter::RasterOp_NotSourceAndDestination31执行一位运算,将源像素反转,然后与目标像素进行与运算 ((NOT src) AND dst)。
QPainter::RasterOp_SourceAndNotDestination32执行位运算,将源像素与反相的目标像素进行与运算(src AND (NOT dst))。
QPainter::RasterOp_NotSourceOrDestination33执行一位运算,将源像素反转,然后与目标进行或运算((NOT src) OR dst)。
QPainter::RasterOp_ClearDestination35目标中的像素被清零(设置为 0),与源无关。
QPainter::RasterOp_SetDestination36目标区域中的像素被设置(设为 1),与源区域无关。
QPainter::RasterOp_NotDestination37执行位运算,将目标像素反转(NOT dst)。
QPainter::RasterOp_SourceOrNotDestination34执行一位运算,将源像素与反相的目标像素进行“或”运算(src OR (NOT dst))。

另请参阅 compositionMode(),setCompositionMode(),Composition Modes 以及“图像合成示例”。

enum QPainter::PixmapFragmentHint
flags QPainter::PixmapFragmentHints

常数值描述
QPainter::OpaqueHint0x01表示待绘制的位图片段是不透明的。不透明片段的绘制速度可能更快。

PixmapFragmentHints 类型是QFlags<PixmapFragmentHint> 的 typedef。它存储了 PixmapFragmentHint 值的按“或”运算组合。

另请参阅 QPainter::drawPixmapFragments() 和QPainter::PixmapFragment 。

enum QPainter::RenderHint
flags QPainter::RenderHints

渲染提示用于向QPainter 指定标志,这些标志可能被特定引擎采纳,也可能不被采纳。

常量值描述
QPainter::Antialiasing0x01表示引擎应在可能的情况下对基元边缘进行抗锯齿处理。
QPainter::TextAntialiasing0x02表示引擎应在可能的情况下对文本进行抗锯齿处理。若要强制禁用文本的抗锯齿处理,请勿使用此提示。相反,请在字体的样式策略中设置QFont::NoAntialias 。
QPainter::SmoothPixmapTransform0x04表示引擎应使用平滑的位图变换算法(如双线性插值),而非最近邻插值。
QPainter::VerticalSubpixelPositioning0x08如果字体引擎支持,则允许文本在垂直和水平方向上以像素的分数值进行定位。目前,当提示首选项为QFont::PreferNoHinting 时,Freetype在所有平台上均支持此功能,macOS上也支持。对于大多数使用场景,这不会提高视觉质量,但可能会增加内存消耗并导致文本渲染性能有所下降。 因此,除非特定使用场景有此需求,否则不建议启用此功能。其中一种典型场景是将字形与其他视觉基元对齐。此选项在 Qt 6.1 中新增。
QPainter::LosslessImageRendering0x40尽可能使用无损图像渲染。目前,仅当通过 `QPrinter ` 或 `QPdfWriter` 采用 `QPainter ` 输出 PDF 文件时,此提示才会生效;此时,`drawImage()`/`drawPixmap()` 调用将使用无损压缩算法对图像进行编码,而非有损的 JPEG 压缩。该值自 Qt 5.13 起添加。
QPainter::NonCosmeticBrushPatterns0x80当使用具有预定义图案样式的画笔进行绘制时,应同时对图案进行变换,与被绘制的对象同步变换。默认情况下,图案被视为装饰性元素,因此图案像素将直接映射到设备像素,不受任何活动变换的影响。该参数自 Qt 6.4 起新增。

RenderHints 类型是QFlags<RenderHint> 的 typedef 定义。它存储 RenderHint 值的按“或”运算组合。

另请参阅 renderHints()、setRenderHint() 和Rendering Quality 。

成员函数文档

QPainter::QPainter()

创建一个画家。

另请参阅 begin() 和end()。

[explicit] QPainter::QPainter(QPaintDevice *device)

创建一个绘图器,该绘图器会立即开始绘制device 。

此构造函数适用于短暂存在的绘图器(例如在QWidget::paintEvent() 中),且应仅调用一次。该构造函数会为您调用begin(),而 QPainter 的析构函数会自动调用end()。

以下是一个使用begin() 和end() 的示例:

void MyWidget::paintEvent(QPaintEvent *)
{
    QPainter p;
    p.begin(this);
    p.drawLine(drawingCode);        // drawing code
    p.end();
}

使用该构造函数的相同示例:

void MyWidget::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    p.drawLine(drawingCode);        // drawing code
}

由于构造函数在绘图器初始化失败时无法提供反馈,因此建议您使用begin() 和end() 在外部设备(例如打印机)上进行绘制。

另请参阅 begin() 和end()。

[noexcept] QPainter::~QPainter()

摧毁了这位画家。

const QBrush &QPainter::background() const

返回当前的背景画笔。

另请参阅 setBackground() 和Settings 。

Qt::BGMode QPainter::backgroundMode() const

返回当前的背景模式。

另请参阅 setBackgroundMode() 和Settings 。

bool QPainter::begin(QPaintDevice *device)

开始绘制颜色device ,如果成功则返回true ;否则返回false 。

请注意,当调用 begin() 时,所有绘图器设置(setPen()、setBrush() 等)都会重置为默认值。

可能发生的错误都是严重的问题,例如:

painter->begin(nullptr); // impossible - paint device cannot be null

QPixmap image(0, 0);
painter->begin(&image); // impossible - image.isNull() == true;

painter->begin(myWidget);
painter2->begin(myWidget); // impossible - only one painter at a time

请注意,大多数情况下,您可以使用构造函数之一代替 begin(),并且在销毁时会自动执行end()。

警告:一个 绘制设备每次只能由一个绘制器进行绘制。

警告: 不支持在QImage 上使用格式为QImage::Format_Indexed8 进行绘制 。

另请参阅 end() 和QPainter()。

void QPainter::beginNativePainting()

清空绘制管道,并为用户直接向底层图形上下文发出命令做好准备。此后必须调用endNativePainting()。

请注意,只有底层绘制引擎更改过的状态才会被重置为各自的默认状态。我们重置的状态可能会因版本而异。目前在 OpenGL 2 引擎中,以下状态会被重置:

  • 禁用混合
  • 深度、模板和剪切测试被禁用
  • 活动纹理单元重置为 0
  • 深度掩码、深度函数和清除深度被重置为默认值
  • 模板掩码、模板运算和模板函数被重置为默认值
  • 当前颜色重置为纯白色

例如,如果用户在 beginNativePaint()/endNativePainting() 代码块内更改了 OpenGL 多边形模式,endNativePainting() 并不会将其重置为默认状态。以下示例展示了绘图命令与原始 OpenGL 命令的混合使用:

QPainter painter(this);
painter.fillRect(0, 0, 128, 128, Qt::green);
painter.beginNativePainting();

glEnable(GL_SCISSOR_TEST);
glScissor(0, 0, 64, 64);

glClearColor(1, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);

glDisable(GL_SCISSOR_TEST);

painter.endNativePainting();

另请参阅 endNativePainting()。

QRectF QPainter::boundingRect(const QRectF &rectangle, int flags, const QString &text)

返回text 的边界矩形,该矩形表示当使用当前设置的font(),在给定的rectangle 内,并采用指定的flags 进行绘制时, 的显示效果;也就是说,该函数告诉你,当drawText()函数接收相同的参数时,它将在何处进行绘制。

如果text 无法在使用指定flags 的情况下适配于给定的rectangle 内,则该函数将返回所需的矩形。

flags 参数是以下标志的按位或(OR)运算结果:

如果同时设置了多个水平对齐标志或多个垂直对齐标志,则最终的对齐方式未定义。

另请参阅 drawText()、Qt::Alignment 和Qt::TextFlag 。

QRect QPainter::boundingRect(const QRect &rectangle, int flags, const QString &text)

返回text 的边界矩形,该矩形表示当其被绘制在给定的rectangle 内、使用指定的flags 并采用当前设置的font()时的外观。

这是一个重载函数。

QRectF QPainter::boundingRect(const QRectF &rectangle, const QString &text, const QTextOption &option = QTextOption())

该重载函数不再将标志指定为Qt::AlignmentFlag 和Qt::TextFlag 的按位或,而是接受一个option 参数。QTextOption 类提供了对通用富文本属性的描述。

这是一个重载函数。

另请参阅 QTextOption 。

QRect QPainter::boundingRect(int x, int y, int w, int h, int flags, const QString &text)

返回给定text 的边界矩形,该矩形将显示为绘制在以点(x,y)为起点的矩形内,该矩形宽度为w ,高度为h 。

这是一个重载函数。

const QBrush &QPainter::brush() const

返回画家的当前画笔。

另请参阅 QPainter::setBrush() 和Settings 。

QPoint QPainter::brushOrigin() const

返回当前画笔的原点。建议使用QPainter::brushOriginF() 来获取精确的原点。

另请参阅 setBrushOrigin() 和Settings 。

[since 6.11] QPointF QPainter::brushOriginF() const

返回当前画笔原点。

该函数于 Qt 6.11 中引入。

另请参阅 setBrushOrigin() 和Settings 。

QRectF QPainter::clipBoundingRect() const

如果存在剪切区域,则返回当前剪切区域的边界矩形;否则返回一个空矩形。请注意,剪切区域采用逻辑坐标表示。

不能保证边界矩形是最紧凑的。

另请参阅 setClipRect()、setClipPath() 和setClipRegion()。

QPainterPath QPainter::clipPath() const

返回当前剪辑路径的逻辑坐标。

警告: QPainter 不会显式存储组合后的剪切路径,因为这由底层的QPaintEngine 负责处理,因此该路径会在需要时重新生成,并转换为当前的逻辑坐标系。这可能是一项耗时的操作。

另请参阅 setClipPath()、clipRegion() 和setClipping()。

QRegion QPainter::clipRegion() const

返回当前设置的剪辑区域。请注意,剪辑区域采用逻辑坐标表示。

警告: QPainter 不会显式存储组合后的剪切区域,因为这由底层的QPaintEngine 负责处理,因此路径会在需要时重新创建,并转换为当前的逻辑坐标系。这可能是一项耗时的操作。

另请参阅 setClipRegion()、clipPath() 以及setClipping()。

QTransform QPainter::combinedTransform() const

返回结合了当前窗口/视口变换和世界变换的变换矩阵。

另请参阅 setWorldTransform()、setWindow() 和setViewport()。

QPainter::CompositionMode QPainter::compositionMode() const

返回当前的合成模式。

另请参阅 CompositionMode 和setCompositionMode()。

QPaintDevice *QPainter::device() const

返回该绘图器当前正在绘制的绘图设备;如果该绘图器未处于活动状态,则返回nullptr 。

另请参阅 isActive()。

const QTransform &QPainter::deviceTransform() const

返回将逻辑坐标转换为平台相关绘制设备的设备坐标的矩阵。

仅当在平台相关的句柄(Qt::HANDLE )上使用平台绘制命令,且该平台本身不进行原生转换时,才需要此函数。

可以通过查询QPaintEngine::PaintEngineFeature 枚举来确定平台是否执行坐标转换。

另请参阅 worldTransform() 和QPaintEngine::hasFeature()。

void QPainter::drawArc(const QRectF &rectangle, int startAngle, int spanAngle)

绘制由给定的rectangle 、startAngle 和spanAngle 定义的圆弧。

startAngle 和spanAngle 必须以1/16度的精度指定,即一整圈等于5760(16 × 360)。角度的正值表示逆时针方向,负值表示顺时针方向。 零度位于3点钟位置。如果rectangle 不是正方形,则这些角度为偏心角,并不表示从矩形中心出发的方向,具体说明请参见Arcs and Ellipses 。

弧线
QRectF rectangle(10.0, 20.0, 80.0, 60.0);
int startAngle = 30 * 16;
int spanAngle = 120 * 16;

QPainter painter(this);
painter.drawArc(rectangle, startAngle, spanAngle);

另请参阅 drawPie()、drawChord() 以及“坐标系”。

void QPainter::drawArc(const QRect &rectangle, int startAngle, int spanAngle)

绘制由给定的rectangle 、startAngle 和spanAngle 定义的弧。

这是一个重载函数。

void QPainter::drawArc(int x, int y, int width, int height, int startAngle, int spanAngle)

绘制由矩形(起始点为 (x,y))所定义的弧,该弧使用指定的width 和height ,以及给定的startAngle 和spanAngle 。

这是一个重载函数。

void QPainter::drawChord(const QRectF &rectangle, int startAngle, int spanAngle)

绘制由给定的rectangle 、startAngle 和spanAngle 定义的弦。该弦将填充为当前的brush()。

startAngle和spanAngle必须以1/16度的精度指定,即一整圈等于5760(16 * 360)。角度的正值表示逆时针方向,负值表示顺时针方向。 零度位于3点钟位置。如果rectangle 不是正方形,则这些角度为偏心角,且不以矩形中心为基准测量方向,具体说明参见Arcs and Ellipses 。

和弦指法
QRectF rectangle(10.0, 20.0, 80.0, 60.0);
int startAngle = 30 * 16;
int spanAngle = 120 * 16;

QPainter painter(this);
painter.drawChord(rect, startAngle, spanAngle);

另请参阅 drawArc()、drawPie() 以及“坐标系”。

void QPainter::drawChord(const QRect &rectangle, int startAngle, int spanAngle)

绘制由给定的rectangle 、startAngle 和spanAngle 定义的弦。

这是一个重载函数。

void QPainter::drawChord(int x, int y, int width, int height, int startAngle, int spanAngle)

绘制由矩形(起始点为 (x,y))所定义的弦,该弦的width 和height 已指定,且startAngle 和spanAngle 已给定。

这是一个重载函数。

void QPainter::drawConvexPolygon(const QPointF *points, int pointCount)

使用当前画笔绘制由数组points 中前pointCount 个点定义的凸多边形。

四边形
static const QPointF points[4] = {
    QPointF(10.0, 80.0),
    QPointF(20.0, 10.0),
    QPointF(80.0, 30.0),
    QPointF(90.0, 70.0)
};

QPainter painter(this);
painter.drawConvexPolygon(points, 4);

第一个点将隐式连接到最后一个点,且多边形将使用当前的brush()进行填充。如果给定的多边形不是凸多边形,即包含至少一个大于180度的角,则结果未定义。

在某些平台(例如 X11)上,drawConvexPolygon() 函数的执行速度可能快于drawPolygon() 函数。

另请参阅 drawPolygon()、drawPolyline() 以及坐标系。

void QPainter::drawConvexPolygon(const QPolygon &polygon)

使用当前的笔和画笔绘制由polygon 定义的凸多边形。

这是一个重载函数。

void QPainter::drawConvexPolygon(const QPolygonF &polygon)

使用当前的笔和画笔绘制由polygon 定义的凸多边形。

这是一个重载函数。

void QPainter::drawConvexPolygon(const QPoint *points, int pointCount)

使用当前画笔绘制由数组points 中前pointCount 个点所定义的凸多边形。

这是一个重载函数。

void QPainter::drawEllipse(const QRectF &rectangle)

绘制由给定的rectangle 定义的椭圆。

实心椭圆的大小为rectangle 。size()。带描边的椭圆的大小为rectangle 。size() 加上笔宽。

椭圆轮廓
QRectF rectangle(10.0, 20.0, 80.0, 60.0);

QPainter painter(this);
painter.drawEllipse(rectangle);

另请参阅 drawPie() 和坐标系。

void QPainter::drawEllipse(const QRect &rectangle)

绘制由给定的rectangle 定义的椭圆。

这是一个重载函数。

void QPainter::drawEllipse(const QPoint &center, int rx, int ry)

绘制位于坐标center 、半径分别为rx 和ry 的椭圆。

这是一个重载函数。

void QPainter::drawEllipse(const QPointF &center, qreal rx, qreal ry)

绘制一个位于center 、半径分别为rx 和ry 的椭圆。

这是一个重载函数。

void QPainter::drawEllipse(int x, int y, int width, int height)

绘制由起始于 (x,y) 的矩形所定义的椭圆,其参数为给定的width 和height 。

这是一个重载函数。

void QPainter::drawGlyphRun(const QPointF &position, const QGlyphRun &glyphs)

绘制由glyphs 在position 处表示的字形。position 指定了该字形串的基线边缘。字形将从glyphs 上选定的字体中获取,并根据glyphs 中给定的位置偏移量进行绘制。

另请参阅 QGlyphRun::setRawFont()、QGlyphRun::setPositions() 和QGlyphRun::setGlyphIndexes()。

void QPainter::drawImage(const QRectF &target, const QImage &image, const QRectF &source, Qt::ImageConversionFlags flags = Qt::AutoColor)

将给定image 的矩形区域source 绘制到绘图设备中的target 矩形内。

注意: 如果图像和矩形的大小不一致,则会缩放图像 以适应矩形。

注意: 有关此操作如何受QImage::devicePixelRatio()影响,请参阅 Drawing High Resolution Versions of Pixmaps and Images 。

如果需要修改图像以适应较低分辨率的结果(例如,从 32 位转换为 8 位),请使用flags 来指定您希望如何进行此操作。

QRectF target(10.0, 20.0, 80.0, 60.0);
QRectF source(0.0, 0.0, 70.0, 40.0);
QImage image(":/images/myImage.png");

QPainter painter(this);
painter.drawImage(target, image, source);

另请参阅 drawPixmap() 和QImage::devicePixelRatio()。

void QPainter::drawImage(const QPoint &point, const QImage &image)

在指定的point 上绘制给定的image 。

这是一个重载函数。

void QPainter::drawImage(const QPointF &point, const QImage &image)

在指定的point 上绘制给定的image 。

这是一个重载函数。

void QPainter::drawImage(const QRect &rectangle, const QImage &image)

将给定的image 绘制到给定的rectangle 中。

注意: 如果图像和矩形的大小不一致,图像 会进行缩放以适应矩形。

这是一个重载函数。

void QPainter::drawImage(const QRectF &rectangle, const QImage &image)

将给定的image 绘制到给定的rectangle 中。

注意: 如果图像和矩形的大小不一致,图像 会按比例缩放以适应矩形。

这是一个重载函数。

void QPainter::drawImage(const QPoint &point, const QImage &image, const QRect &source, Qt::ImageConversionFlags flags = Qt::AutoColor)

绘制给定矩形区域source ,该区域属于给定的image ,其原点位于给定的point 处。

这是一个重载函数。

void QPainter::drawImage(const QPointF &point, const QImage &image, const QRectF &source, Qt::ImageConversionFlags flags = Qt::AutoColor)

绘制给定坐标系image 中以给定点point 为原点的矩形区域source 。

这是一个重载函数。

void QPainter::drawImage(const QRect &target, const QImage &image, const QRect &source, Qt::ImageConversionFlags flags = Qt::AutoColor)

将给定的image 中的矩形区域source 绘制到绘图设备中的target 矩形内。

注意: 如果图像和矩形尺寸不一致,则会缩放图像 以适应矩形。

这是一个重载函数。

void QPainter::drawImage(int x, int y, const QImage &image, int sx = 0, int sy = 0, int sw = -1, int sh = -1, Qt::ImageConversionFlags flags = Qt::AutoColor)

在坐标 (x,y) 处绘制图像,方法是将image 的一部分复制到绘图设备中。

(x,y) 指定要绘制在绘图设备上的左上角点。 (sx,sy) 指定要绘制的图像image 中的左上角点。默认值为 (0, 0)。

(sw,sh) 指定要绘制的图像的大小。默认值 (0, 0)(以及负数)表示绘制范围将延伸至图像的右下角。

这是一个重载函数。

void QPainter::drawLine(const QLineF &line)

绘制由line 定义的直线。

对角线
QLineF line(10.0, 80.0, 90.0, 20.0);

QPainter painter(this);
painter.drawLine(line);

另请参阅 drawLines()、drawPolyline()以及“坐标系”。

void QPainter::drawLine(const QLine &line)

绘制由line 定义的直线。

这是一个重载函数。

void QPainter::drawLine(const QPoint &p1, const QPoint &p2)

从p1 到p2 画一条线。

这是一个重载函数。

void QPainter::drawLine(const QPointF &p1, const QPointF &p2)

从p1 到p2 绘制一条直线。

这是一个重载函数。

void QPainter::drawLine(int x1, int y1, int x2, int y2)

绘制一条从 (x1,y1) 到 (x2,y2) 的直线。

这是一个重载函数。

void QPainter::drawLines(const QLineF *lines, int lineCount)

使用当前画笔在数组lines 中绘制前lineCount 条线。

另请参阅 drawLine() 和drawPolyline()。

void QPainter::drawLines(const QList<QLine> &lines)

使用当前的笔和画笔,绘制由列表lines 定义的一组直线。

这是一个重载函数。

void QPainter::drawLines(const QList<QLineF> &lines)

使用当前的笔和画笔,绘制由列表lines 定义的一组直线。

这是一个重载函数。

void QPainter::drawLines(const QList<QPoint> &pointPairs)

使用当前画笔,为向量pointPairs 中的每对点绘制一条线。

这是一个重载函数。

void QPainter::drawLines(const QList<QPointF> &pointPairs)

使用当前画笔,针对向量pointPairs 中的每一对点绘制一条直线。如果数组中的点数为奇数,则最后一个点将被忽略。

这是一个重载函数。

void QPainter::drawLines(const QLine *lines, int lineCount)

使用当前画笔,在数组lines 中绘制前lineCount 条线。

这是一个重载函数。

void QPainter::drawLines(const QPoint *pointPairs, int lineCount)

使用当前画笔,在数组pointPairs 中绘制前lineCount 条线。

这是一个重载函数。

void QPainter::drawLines(const QPointF *pointPairs, int lineCount)

使用当前画笔,在数组pointPairs 中绘制前lineCount 条线。这些线由点对指定,因此pointPairs 中的条目数必须至少为lineCount * 2。

这是一个重载函数。

void QPainter::drawPath(const QPainterPath &path)

使用当前的笔绘制轮廓,并使用当前的画笔进行填充,以绘制给定的画家path 。

贝塞尔曲线路径
QPainterPath path;
path.moveTo(20, 80);
path.lineTo(20, 30);
path.cubicTo(80, 0, 50, 50, 80, 80);

QPainter painter(this);
painter.drawPath(path);

另请参阅 “Painter Paths”示例和“Vector Deformation”示例。

void QPainter::drawPicture(const QPointF &point, const QPicture &picture)

在指定的point 上重放给定的picture 。

QPicture 类是一种绘图设备,用于记录和重放QPainter 命令。Picture将绘图命令以一种与平台无关的格式序列化到IO设备中。凡是在小部件或像素图上可以绘制的内容,均可存储在Picture中。

当调用此函数时,若将point 设为QPointF(0, 0),其行为与QPicture::play() 完全一致。

注意: 此函数会保留绘图器的状态 。

QPicture picture;
QPointF point(10.0, 20.0);
picture.load("drawing.pic");

QPainter painter(this);
painter.drawPicture(0, 0, picture);

另请参阅 QPicture::play()。

void QPainter::drawPicture(const QPoint &point, const QPicture &picture)

在指定的point 上重放给定的picture 。

这是一个重载函数。

void QPainter::drawPicture(int x, int y, const QPicture &picture)

在点 (x,y) 处绘制给定的picture 。

这是一个重载函数。

void QPainter::drawPie(const QRectF &rectangle, int startAngle, int spanAngle)

绘制一个由给定的rectangle 、startAngle 和spanAngle 定义的饼图。

该扇形将填充当前的brush()。

startAngle 和 spanAngle 必须以 1/16 度为单位指定,即一整圈等于 5760(16 × 360)。角度的正值表示逆时针方向,负值表示顺时针方向。 零度位于3点钟位置。如果rectangle 不是正方形,则这些角度为偏心角,并不表示从矩形中心出发的方向,具体说明请参见Arcs and Ellipses 。

扇形
QRectF rectangle(10.0, 20.0, 80.0, 60.0);
int startAngle = 30 * 16;
int spanAngle = 120 * 16;

QPainter painter(this);
painter.drawPie(rectangle, startAngle, spanAngle);

另请参阅 drawEllipse()、drawChord() 以及“坐标系”。

void QPainter::drawPie(const QRect &rectangle, int startAngle, int spanAngle)

绘制由给定的rectangle 、startAngle 和spanAngle 定义的饼图。

这是一个重载函数。

void QPainter::drawPie(int x, int y, int width, int height, int startAngle, int spanAngle)

绘制由矩形(起始点为 (x,y))所定义的扇形,其中width 和height 为指定值,startAngle 和spanAngle 为给定值。

这是一个重载函数。

void QPainter::drawPixmap(const QRectF &target, const QPixmap &pixmap, const QRectF &source)

将给定的pixmap 中的矩形区域source 绘制到绘图设备中给定的target 中。

注意: 如果像素图和矩形的大小不一致,像素图 将按比例缩放以适应矩形。

注意: 有关此操作如何受QPixmap::devicePixelRatio()影响,请参阅 Drawing High Resolution Versions of Pixmaps and Images 。

QRectF target(10.0, 20.0, 80.0, 60.0);
QRectF source(0.0, 0.0, 70.0, 40.0);
QPixmap pixmap(":myPixmap.png");

QPainter painter(this);
painter.drawPixmap(target, pixmap, source);

如果pixmap 是QBitmap ,则使用画笔颜色绘制“设置”的位;如果backgroundMode 是Qt::OpaqueMode ,则使用背景画笔的颜色绘制“未设置”的位;如果backgroundMode 是Qt::TransparentMode ,则“未设置”的位为透明。不支持使用渐变色或纹理色绘制位图。

另请参阅 drawImage() 和QPixmap::devicePixelRatio()。

void QPainter::drawPixmap(const QPoint &point, const QPixmap &pixmap)

绘制给定的pixmap ,其原点位于给定的point 。

这是一个重载函数。

void QPainter::drawPixmap(const QPointF &point, const QPixmap &pixmap)

绘制给定的pixmap ,其原点位于给定的point 处。

这是一个重载函数。

void QPainter::drawPixmap(const QRect &rectangle, const QPixmap &pixmap)

将给定的pixmap 绘制到给定的rectangle 中。

注意: 如果位图和矩形的大小不一致,则会缩放位图 以适应矩形。

这是一个重载函数。

void QPainter::drawPixmap(const QPoint &point, const QPixmap &pixmap, const QRect &source)

绘制给定矩形区域source ,该区域属于给定的pixmap ,其原点位于给定的point 。

这是一个重载函数。

void QPainter::drawPixmap(const QPointF &point, const QPixmap &pixmap, const QRectF &source)

绘制给定矩形区域source ,该区域属于给定矩形pixmap ,其原点位于给定坐标point 。

这是一个重载函数。

void QPainter::drawPixmap(const QRect &target, const QPixmap &pixmap, const QRect &source)

将给定的pixmap 中的矩形区域source 绘制到绘图设备中给定的target 中。

注意: 如果位图和矩形的大小不一致,则会缩放位图 以适应矩形。

这是一个重载函数。

void QPainter::drawPixmap(int x, int y, const QPixmap &pixmap)

在位置 (x,y) 处绘制给定的pixmap 。

这是一个重载函数。

void QPainter::drawPixmap(int x, int y, int width, int height, const QPixmap &pixmap)

将pixmap 绘制到坐标为(x,y)的矩形中,并应用给定的width 和height 。

这是一个重载函数。

void QPainter::drawPixmap(int x, int y, const QPixmap &pixmap, int sx, int sy, int sw, int sh)

在坐标 (x,y) 处绘制一张位图,方法是将给定的pixmap 的一部分复制到绘图设备中。

(x,y) 指定要绘制的绘图设备中的左上角点。(sx,sy) 指定要绘制的pixmap 中的左上角点。默认值为 (0, 0)。

(sw,sh) 指定要绘制的像素图的大小。默认值 (0, 0)(以及负数)表示绘制范围一直延伸到像素图的右下角。

这是一个重载函数。

void QPainter::drawPixmap(int x, int y, int w, int h, const QPixmap &pixmap, int sx, int sy, int sw, int sh)

在坐标点 (sx,sy) 处,绘制给定像素图pixmap 的矩形部分,其宽度为sw ,高度为sh ,并以坐标点 (x,y) 为中心,宽度为w ,高度为h 。如果 sw 或 sh 等于零,则使用像素图的宽度/高度,并通过偏移量 sx/sy 进行调整;

这是一个重载函数。

void QPainter::drawPixmapFragments(const QPainter::PixmapFragment *fragments, int fragmentCount, const QPixmap &pixmap, QPainter::PixmapFragmentHints hints = PixmapFragmentHints())

该函数用于在多个位置以不同的缩放比例、旋转角度和不透明度绘制pixmap ,或pixmap 的子矩形。fragments 是一个由fragmentCount 元素组成的数组,用于指定绘制每个像素图片段所用的参数。hints 参数可用于传递绘制提示。

由于后端可以优化状态变更,因此该函数的速度可能比多次调用drawPixmap() 更快。

另请参阅 QPainter::PixmapFragment 和QPainter::PixmapFragmentHint 。

void QPainter::drawPoint(const QPointF &position)

使用当前画笔的颜色,在给定的position 坐标处绘制一个点。

另请参阅 “坐标系”。

void QPainter::drawPoint(const QPoint &position)

使用当前画笔的颜色,在给定的position 坐标处绘制一个点。

这是一个重载函数。

void QPainter::drawPoint(int x, int y)

在坐标 (x,y) 处绘制一个点。

这是一个重载函数。

void QPainter::drawPoints(const QPointF *points, int pointCount)

使用当前画笔的颜色,绘制数组points 中的前pointCount 个点。

另请参阅 “坐标系”。

void QPainter::drawPoints(const QPolygon &points)

绘制向量points 中的点。

这是一个重载函数。

void QPainter::drawPoints(const QPolygonF &points)

绘制向量points 中的点。

这是一个重载函数。

void QPainter::drawPoints(const QPoint *points, int pointCount)

使用当前画笔的颜色,绘制数组points 中的前pointCount 个点。

这是一个重载函数。

void QPainter::drawPolygon(const QPointF *points, int pointCount, Qt::FillRule fillRule = Qt::OddEvenFill)

使用当前的画笔和笔刷,绘制由数组points 中前pointCount 个点所定义的多边形。

四边形
static const QPointF points[4] = {
    QPointF(10.0, 80.0),
    QPointF(20.0, 10.0),
    QPointF(80.0, 30.0),
    QPointF(90.0, 70.0)
};

QPainter painter(this);
painter.drawPolygon(points, 4);

第一个点会隐式连接到最后一个点,且多边形将使用当前的brush()进行填充。

如果fillRule 为Qt::WindingFill ,则使用绕行填充算法对多边形进行填充。如果fillRule 为Qt::OddEvenFill ,则使用奇偶填充算法对多边形进行填充。有关这些填充规则的更详细说明,请参阅Qt::FillRule 。

另请参阅 drawConvexPolygon()、drawPolyline() 以及“坐标系”。

void QPainter::drawPolygon(const QPolygon &points, Qt::FillRule fillRule = Qt::OddEvenFill)

使用填充规则fillRule 绘制由给定的points 定义的多边形。

这是一个重载函数。

void QPainter::drawPolygon(const QPolygonF &points, Qt::FillRule fillRule = Qt::OddEvenFill)

使用填充规则fillRule 绘制由给定的points 定义的多边形。

这是一个重载函数。

void QPainter::drawPolygon(const QPoint *points, int pointCount, Qt::FillRule fillRule = Qt::OddEvenFill)

绘制由数组points 中的前pointCount 个点所定义的多边形。

这是一个重载函数。

void QPainter::drawPolyline(const QPointF *points, int pointCount)

使用当前画笔,在points 中绘制由第一个pointCount 中的点定义的多线。

请注意,与drawPolygon()函数不同,最后一个点不会与第一个点相连,多线段也不会被填充。

static const QPointF points[3] = {
    QPointF(10.0, 80.0),
    QPointF(20.0, 10.0),
    QPointF(80.0, 30.0),
};

QPainter painter(this);
painter.drawPolyline(points, 3);

另请参阅 drawLines()、drawPolygon() 以及“坐标系”。

void QPainter::drawPolyline(const QPolygon &points)

使用当前画笔绘制由给定的points 定义的多段线。

这是一个重载函数。

void QPainter::drawPolyline(const QPolygonF &points)

使用当前画笔绘制由给定的points 定义的多线。

这是一个重载函数。

void QPainter::drawPolyline(const QPoint *points, int pointCount)

使用当前画笔,绘制由points 中前pointCount 个点定义的多段线。

这是一个重载函数。

void QPainter::drawRect(const QRectF &rectangle)

使用当前的笔和画笔绘制当前的rectangle 。

实心矩形的大小为rectangle 乘以size() 。带边框的矩形的大小为rectangle 乘以size() 加上笔宽。

矩形轮廓
QRectF rectangle(10.0, 20.0, 80.0, 60.0);

QPainter painter(this);
painter.drawRect(rectangle);

另请参阅 drawRects()、drawPolygon(),以及“坐标系”。

void QPainter::drawRect(const QRect &rectangle)

使用当前的笔和画笔绘制当前的rectangle 。

这是一个重载函数。

void QPainter::drawRect(int x, int y, int width, int height)

绘制一个矩形,其左上角位于 (x,y),并使用给定的width 和height 。

这是一个重载函数。

void QPainter::drawRects(const QRectF *rectangles, int rectCount)

使用当前的笔和画笔,绘制给定rectangles 的第一个rectCount 。

另请参阅 drawRect()。

void QPainter::drawRects(const QList<QRect> &rectangles)

使用当前的笔和画笔绘制给定的rectangles 。

这是一个重载函数。

void QPainter::drawRects(const QList<QRectF> &rectangles)

使用当前的笔和画笔绘制给定的rectangles 。

这是一个重载函数。

void QPainter::drawRects(const QRect *rectangles, int rectCount)

使用当前的笔和画笔,绘制给定坐标组(rectangles )中的第一个点(rectCount )。

这是一个重载函数。

void QPainter::drawRoundedRect(const QRectF &rect, qreal xRadius, qreal yRadius, Qt::SizeMode mode = Qt::AbsoluteSize)

绘制给定的矩形rect ,并使其圆角化。

参数xRadius 和yRadius 指定了定义圆角矩形各角的椭圆半径。当mode 为Qt::RelativeSize 时,xRadius 和yRadius 分别以矩形宽度和高度的一半为基准,以百分比形式指定,且值应在0.0到100.0之间。

填充矩形的大小为 rect。size() 。描边矩形的大小为 rect。size() 加上笔宽。

圆角矩形轮廓
QRectF rectangle(10.0, 20.0, 80.0, 60.0);

QPainter painter(this);
painter.drawRoundedRect(rectangle, 20.0, 15.0);

另请参阅 drawRect() 和QPen 。

void QPainter::drawRoundedRect(const QRect &rect, qreal xRadius, qreal yRadius, Qt::SizeMode mode = Qt::AbsoluteSize)

绘制给定的矩形rect ,并使其圆角化。

这是一个重载函数。

void QPainter::drawRoundedRect(int x, int y, int w, int h, qreal xRadius, qreal yRadius, Qt::SizeMode mode = Qt::AbsoluteSize)

绘制给定的矩形:x 、y 、w 、h ,并使其圆角化。

这是一个重载函数。

void QPainter::drawStaticText(const QPointF &topLeftPosition, const QStaticText &staticText)

在指定的topLeftPosition 处绘制给定的staticText 。

文本将使用绘图器上设置的字体和变换进行绘制。如果绘图器上设置的字体和/或变换与初始化QStaticText 布局时使用的不同,则必须重新计算布局。请使用QStaticText::prepare()方法,使用后续绘制时将使用的字体和变换来初始化staticText 。

如果topLeftPosition 与staticText 初始化时或上次绘制时的状态不一致,那么在将文本转换到新位置时会产生轻微的开销。

注意:如果 绘制器的变换不是仿射变换,则staticText 将通过常规调用drawText()进行绘制,从而失去任何潜在的性能提升。

注意:y 坐标 被用作字体的顶部位置 。

另请参阅 QStaticText 。

void QPainter::drawStaticText(const QPoint &topLeftPosition, const QStaticText &staticText)

在坐标topLeftPosition 处绘制staticText 。

注意:y 坐标 被用作字体的顶部位置 。

这是一个重载函数。

void QPainter::drawStaticText(int left, int top, const QStaticText &staticText)

在坐标left 和top 处绘制staticText 。

注意:y 坐标 被用作字体的顶部位置 。

这是一个重载函数。

void QPainter::drawText(const QPointF &position, const QString &text)

使用当前定义的文本方向,从给定的position 位置开始绘制给定的text 。

该函数不处理换行符(\n ),因为它无法将文本拆分为多行,也无法显示换行符。若需绘制包含换行符的多行文本,或希望文本自动换行,请改用接受矩形参数的 QPainter::drawText() 重载函数。

默认情况下,QPainter 会以抗锯齿方式绘制文本。

注意:y 坐标用作字体的基线。

另请参阅 setFont() 和setPen()。

void QPainter::drawText(const QPoint &position, const QString &text)

使用当前定义的文本方向,从指定的position 位置开始绘制给定的text 。

默认情况下,QPainter 会以抗锯齿方式绘制文本。

注意:y 坐标用作字体的基线。

这是一个重载函数。

另请参阅 setFont() 和setPen()。

void QPainter::drawText(const QRectF &rectangle, const QString &text, const QTextOption &option = QTextOption())

在rectangle 中绘制给定的text ,并使用option 来控制其位置、方向和倾斜角度。option 中指定的选项将覆盖QPainter 对象本身设置的选项。

默认情况下,QPainter 会以抗锯齿方式绘制文本。

注意: rectangle 的 y 坐标被用作字体的顶部位置。

这是一个重载函数。

另请参阅 setFont() 和setPen()。

void QPainter::drawText(int x, int y, const QString &text)

使用绘图器当前定义的文本方向,在位置 (x,y) 处绘制给定的text 。

默认情况下,QPainter 会以抗锯齿方式绘制文本。

注意:y 坐标用作字体的基线。

这是一个重载函数。

另请参阅 setFont() 和setPen()。

void QPainter::drawText(const QRect &rectangle, int flags, const QString &text, QRect *boundingRect = nullptr)

根据指定的flags ,在给定的rectangle 内绘制text 。

boundingRect (若不为空)用于设定边界矩形,使其能够完全包围整个文本。例如,在下图中,虚线代表由该函数计算得到的boundingRect ,而点划线代表rectangle :

带有边界矩形的文本
QPainter painter(this);
QFont font = painter.font();
font.setPixelSize(48);
painter.setFont(font);

const QRect rectangle = QRect(0, 0, 100, 50);
QRect boundingRect;
painter.drawText(rectangle, 0, tr("Hello"), &boundingRect);

QPen pen = painter.pen();
pen.setStyle(Qt::DotLine);
painter.setPen(pen);
painter.drawRect(boundingRect.adjusted(0, 0, -pen.width(), -pen.width()));

pen.setStyle(Qt::DashLine);
painter.setPen(pen);
painter.drawRect(rectangle.adjusted(0, 0, -pen.width(), -pen.width()));

默认情况下,QPainter 会以抗锯齿方式绘制文本。

注意: rectangle 的y 坐标 被用作字体的顶部。

这是一个重载函数。

另请参阅 setFont() 和setPen()。

void QPainter::drawText(const QRectF &rectangle, int flags, const QString &text, QRectF *boundingRect = nullptr)

在指定的rectangle 内绘制给定的text 。rectangle 与对齐方式flags 共同定义了text 的锚点。

显示 Qt 项目的文本
QPainter painter(this);
painter.drawText(rect, Qt::AlignCenter, tr("Qt\nProject"));

boundingRect (若不为空)用于指定边界矩形应具备的尺寸,以便将整个文本完全包含其中。例如,在下图中,虚线代表由该函数计算得到的boundingRect ,而点线则代表rectangle :

带有边界矩形的文本
QPainter painter(this);
QFont font = painter.font();
font.setPixelSize(48);
painter.setFont(font);

const QRect rectangle = QRect(0, 0, 100, 50);
QRect boundingRect;
painter.drawText(rectangle, 0, tr("Hello"), &boundingRect);

QPen pen = painter.pen();
pen.setStyle(Qt::DotLine);
painter.setPen(pen);
painter.drawRect(boundingRect.adjusted(0, 0, -pen.width(), -pen.width()));

pen.setStyle(Qt::DashLine);
painter.setPen(pen);
painter.drawRect(rectangle.adjusted(0, 0, -pen.width(), -pen.width()));

flags 参数是以下标志的按位或运算结果:

默认情况下,QPainter 会以抗锯齿方式绘制文本。

注意: rectangle 的y 坐标 被用作字体的顶部。

这是一个重载函数。

另请参阅 Qt::AlignmentFlag 、Qt::TextFlag 、boundingRect() 以及layoutDirection()。

void QPainter::drawText(int x, int y, int width, int height, int flags, const QString &text, QRect *boundingRect = nullptr)

在以 (x,y) 为原点、width 和height 为边长的矩形内绘制给定的text 。

boundingRect (若不为空)用于定义边界矩形,该矩形应能够完全包围整个文本。例如,在下图中,虚线代表由该函数计算得到的boundingRect ,而点划线代表由x 、y 、width 和height 定义的矩形:

带有边界矩形的文本
QPainter painter(this);
QFont font = painter.font();
font.setPixelSize(48);
painter.setFont(font);

const QRect rectangle = QRect(0, 0, 100, 50);
QRect boundingRect;
painter.drawText(rectangle, 0, tr("Hello"), &boundingRect);

QPen pen = painter.pen();
pen.setStyle(Qt::DotLine);
painter.setPen(pen);
painter.drawRect(boundingRect.adjusted(0, 0, -pen.width(), -pen.width()));

pen.setStyle(Qt::DashLine);
painter.setPen(pen);
painter.drawRect(rectangle.adjusted(0, 0, -pen.width(), -pen.width()));

flags 参数是以下标志位的按位或运算结果:

默认情况下,QPainter 会以抗锯齿方式绘制文本。

注意:y 坐标 被用作字体的顶部位置 。

这是一个重载函数。

另请参阅 Qt::AlignmentFlag 、Qt::TextFlag 、setFont() 以及setPen()。

void QPainter::drawTiledPixmap(const QRectF &rectangle, const QPixmap &pixmap, const QPointF &position = QPointF())

在给定的rectangle 内,以给定的position 为原点,绘制一个平铺的pixmap 。

调用 drawTiledPixmap() 的效果类似于多次调用drawPixmap() 来用位图填充(平铺)一个区域,但根据底层窗口系统的不同,其效率可能要高得多。

与普通 dpi 显示器相比,drawTiledPixmap() 在高 dpi 显示器(devicePixelRatio > 1)上将生成相同的视觉平铺图案。 通过设置pixmap 上的 devicePixelRatio 来控制拼贴块的大小。例如,将其设置为 2 会将拼贴块的宽度和高度减半(在 1x 和 2x 显示器上均如此),并在 2x 显示器上生成高分辨率输出。

position 的偏移量以与rectangle 左上角相对的设备独立像素为单位提供。可通过position 将重复图案对齐到rectangle 内部。

另请参阅 drawPixmap()。

void QPainter::drawTiledPixmap(const QRect &rectangle, const QPixmap &pixmap, const QPoint &position = QPoint())

在给定的rectangle 内绘制一个平铺的pixmap ,其原点位于给定的position 处。

这是一个重载函数。

void QPainter::drawTiledPixmap(int x, int y, int width, int height, const QPixmap &pixmap, int sx = 0, int sy = 0)

在指定的矩形内绘制一个平铺的pixmap 。

(x,y) 指定要在绘图设备上进行绘制的左上角点;其中width 和height 已给定。

(sx,sy) 指定了将在指定矩形内绘制位图的原点。原点位置以设备独立像素为单位,相对于 (x,y) 指定。默认值为 (0, 0)。

这是一个重载函数。

bool QPainter::end()

结束绘制。绘制过程中使用的所有资源均被释放。通常无需调用此方法,因为它会由析构函数自动调用。

如果绘制器不再处于活动状态,则返回true ;否则返回false 。

另请参阅 begin() 和isActive()。

void QPainter::endNativePainting()

在手动发出原生绘制命令后,恢复绘图器的状态。允许绘图器在调用任何其他绘图命令之前,恢复其所依赖的任何原生状态。

另请参阅 beginNativePainting()。

void QPainter::eraseRect(const QRectF &rectangle)

清除给定rectangle 内部的区域。相当于调用

fillRect(rectangle, background());

另请参阅 fillRect()。

void QPainter::eraseRect(const QRect &rectangle)

清除给定rectangle 内部的区域。

这是一个重载函数。

void QPainter::eraseRect(int x, int y, int width, int height)

清除以(x,y)为起点的矩形内部区域,并应用给定的width 和height 。

这是一个重载函数。

void QPainter::fillPath(const QPainterPath &path, const QBrush &brush)

使用给定的brush 填充给定的path 。不绘制轮廓。

此外,您也可以指定一个QColor 代替QBrush ;QBrush 构造函数(接受QColor 参数)将自动创建一个实心图案画笔。

另请参阅 drawPath()。

void QPainter::fillRect(const QRectF &rectangle, const QBrush &brush)

将指定的brush 填充到给定的rectangle 中。

此外,您也可以指定一个QColor 来代替QBrush ;QBrush 构造函数(接受QColor 参数)将自动创建一个实心图案画笔。

另请参阅 drawRect()。

void QPainter::fillRect(const QRect &rectangle, QGradient::Preset preset)

将给定的rectangle 填充为指定的渐变preset 。

这是一个重载函数。

void QPainter::fillRect(const QRect &rectangle, Qt::BrushStyle style)

使用指定的画笔style 填充给定的rectangle 。

这是一个重载函数。

void QPainter::fillRect(const QRect &rectangle, Qt::GlobalColor color)

将给定的rectangle 填充为指定的color 。

这是一个重载函数。

void QPainter::fillRect(const QRect &rectangle, const QBrush &brush)

将给定的rectangle 填充为指定的brush 。

这是一个重载函数。

void QPainter::fillRect(const QRect &rectangle, const QColor &color)

将指定的rectangle 填充为指定的color 。

这是一个重载函数。

void QPainter::fillRect(const QRectF &rectangle, QGradient::Preset preset)

将给定的rectangle 填充为指定的渐变preset 。

这是一个重载函数。

void QPainter::fillRect(const QRectF &rectangle, Qt::BrushStyle style)

使用指定的画笔style 填充给定的rectangle 。

这是一个重载函数。

void QPainter::fillRect(const QRectF &rectangle, Qt::GlobalColor color)

将给定的rectangle 填充为指定的color 。

这是一个重载函数。

void QPainter::fillRect(const QRectF &rectangle, const QColor &color)

将指定的rectangle 填充为color 。

这是一个重载函数。

void QPainter::fillRect(int x, int y, int width, int height, QGradient::Preset preset)

使用给定的渐变色preset ,将起始于(x,y)的矩形填充为给定的width 和height 。

这是一个重载函数。

void QPainter::fillRect(int x, int y, int width, int height, Qt::BrushStyle style)

使用指定的画笔style ,将起始于(x,y)的矩形填充为给定的width 和height 。

这是一个重载函数。

void QPainter::fillRect(int x, int y, int width, int height, Qt::GlobalColor color)

使用给定的color ,将起始于(x,y)的矩形填充为给定的width 和height 。

这是一个重载函数。

void QPainter::fillRect(int x, int y, int width, int height, const QBrush &brush)

使用给定的brush ,将以(x,y)为起点的矩形填充为给定的width 和height 。

这是一个重载函数。

void QPainter::fillRect(int x, int y, int width, int height, const QColor &color)

使用给定的color ,将以(x,y)为起点的矩形填充为给定的width 和height 。

这是一个重载函数。

const QFont &QPainter::font() const

返回当前用于绘制文本的已设置字体。

另请参阅 setFont()、drawText(),以及Settings 。

QFontInfo QPainter::fontInfo() const

如果绘图器处于活动状态,则返回该绘图器的字体信息。否则,返回值未定义。

另请参阅 font(),isActive() 以及Settings 。

QFontMetrics QPainter::fontMetrics() const

如果绘图器处于活动状态,则返回该绘图器的字体度量数据。否则,返回值未定义。

另请参阅 font()、isActive() 以及Settings 。

bool QPainter::hasClipping() const

如果已设置裁剪,则返回true ;否则返回false 。

另请参见 setClipping() 和Clipping 。

bool QPainter::isActive() const

如果已调用begin(),但尚未调用end(),则返回true ;否则返回false 。

另请参阅 begin() 和QPaintDevice::paintingActive()。

Qt::LayoutDirection QPainter::layoutDirection() const

返回绘图器在绘制文本时使用的布局方向。

另请参阅 QTextOption::textDirection()、setLayoutDirection()、drawText() 以及Settings 。

qreal QPainter::opacity() const

返回画笔的不透明度。默认值为 1。

另请参阅 ` setOpacity()`。

QPaintEngine *QPainter::paintEngine() const

如果绘制器处于活动状态,则返回绘制器当前正在操作的绘制引擎;否则返回 0。

另请参阅 isActive()。

const QPen &QPainter::pen() const

返回画师当前的画笔。

另请参阅 setPen() 和Settings 。

QPainter::RenderHints QPainter::renderHints() const

返回一个标志,用于指定为该绘制器设置的渲染提示。

另请参阅 setRenderHints()、testRenderHint() 以及Rendering Quality 。

void QPainter::resetTransform()

重置使用translate()、scale()、shear()、rotate()、setWorldTransform()、setViewport() 和setWindow() 进行的任何变换。

另请参阅 Coordinate Transformations 。

void QPainter::restore()

恢复当前绘图器的状态(从栈中弹出一个已保存的状态)。

另请参阅 save()。

void QPainter::rotate(qreal angle)

将坐标系顺时针旋转。给定的angle 参数以度为单位。

另请参阅 setWorldTransform() 和Coordinate Transformations 。

void QPainter::save()

保存当前绘制器的状态(将状态压入栈中)。调用 save() 后必须跟上相应的restore(); 函数end() 用于从栈中弹出状态。

另请参阅 restore()。

void QPainter::scale(qreal sx, qreal sy)

按 (sx,sy) 缩放坐标系。

另请参阅 setWorldTransform() 和Coordinate Transformations 。

void QPainter::setBackground(const QBrush &brush)

将绘图工具的背景画笔设置为指定的brush 。

背景画笔是在绘制不透明文本、点画线和位图时用于填充的画笔。在透明背景模式下(这是默认设置),背景画笔不产生任何效果。

另请参阅 background()、setBackgroundMode() 和Settings 。

void QPainter::setBackgroundMode(Qt::BGMode mode)

将绘图器的背景模式设置为指定的mode

Qt::TransparentMode (默认)会绘制点状线条和文本,而不设置背景像素。Qt::OpaqueMode 会用当前背景色填充这些区域。

请注意,若要以透明方式绘制位图或像素图,必须使用QPixmap::setMask()。

另请参阅 backgroundMode()、setBackground() 和Settings 。

void QPainter::setBrush(const QBrush &brush)

将绘图工具的画笔设置为指定的brush 。

画笔决定了形状的填充方式。

另请参阅 brush()和Settings 。

[since 6.11] void QPainter::setBrush(QBrush &&brush)

这是一个重载函数。

该函数在 Qt 6.11 中引入。

[since 6.9] void QPainter::setBrush(QColor color)

将画家的画笔设置为带有指定color 的实心画笔。

这是一个重载函数。

该函数在 Qt 6.9 中引入。

void QPainter::setBrush(Qt::BrushStyle style)

将画笔颜色设置为黑色,并将画笔的style 属性设置为指定值。

这是一个重载函数。

[since 6.9] void QPainter::setBrush(Qt::GlobalColor color)

将画家的画笔设置为带指定color 的实心画笔。

这是一个重载函数。

该函数在 Qt 6.9 中引入。

void QPainter::setBrushOrigin(const QPointF &position)

将画笔原点设置为position 。

画笔原点指定了绘图器的画笔的 (0, 0) 坐标。

请注意,虽然在 Qt 3 中必须调用brushOrigin() 才能使小部件采用父窗口的背景,但在 Qt 4 中情况已不再如此,因为 Qt 4 的绘图器不会绘制背景,除非您通过将小部件的autoFillBackground 属性设置为 true 来明确指示其执行此操作。

另请参阅 brushOrigin() 和Settings 。

void QPainter::setBrushOrigin(const QPoint &position)

将画笔的原点设置为给定的position 。

这是一个重载函数。

void QPainter::setBrushOrigin(int x, int y)

将画笔的原点设置为点 (x,y)。

这是一个重载函数。

void QPainter::setClipPath(const QPainterPath &path, Qt::ClipOperation operation = Qt::ReplaceClip)

启用裁剪功能,并将绘图工具的裁剪路径设置为给定的path ,裁剪operation 。

请注意,裁剪路径是以逻辑(绘图器)坐标指定的。

另请参阅 clipPath()、clipRegion() 以及Clipping 。

void QPainter::setClipRect(const QRectF &rectangle, Qt::ClipOperation operation = Qt::ReplaceClip)

启用裁剪功能,并使用给定的裁剪矩形坐标(clipoperation )将裁剪区域设置为给定的rectangle 。默认操作是替换当前的裁剪矩形。

请注意,剪切矩形使用逻辑(绘图)坐标进行指定。

另请参阅 clipRegion()、setClipping() 以及Clipping 。

void QPainter::setClipRect(int x, int y, int width, int height, Qt::ClipOperation operation = Qt::ReplaceClip)

启用裁剪功能,并将裁剪区域设置为以 (x,y) 为起点的矩形,同时使用给定的width 和height 。

void QPainter::setClipRect(const QRect &rectangle, Qt::ClipOperation operation = Qt::ReplaceClip)

启用裁剪功能,并使用给定的裁剪区域坐标(clipoperation )将裁剪区域设置为给定的裁剪区域坐标(rectangle )。

这是一个重载函数。

void QPainter::setClipRegion(const QRegion &region, Qt::ClipOperation operation = Qt::ReplaceClip)

使用指定的剪切操作operation 将剪切区域设置为给定的region 。默认的剪切操作是替换当前的剪切区域。

请注意,剪切区域使用逻辑坐标表示。

另请参阅 clipRegion()、setClipRect() 以及Clipping 。

void QPainter::setClipping(bool enable)

如果enable 为 true,则启用剪切;如果enable 为 false,则禁用剪切。

另请参阅 hasClipping() 和Clipping 。

void QPainter::setCompositionMode(QPainter::CompositionMode mode)

将合成模式设置为给定的mode 。

警告:只有在 QImage 上运行的QPainter 才能完全支持所有合成模式。如compositionMode()中所描述,X11支持RasterOp模式。

另请参阅 compositionMode()。

void QPainter::setFont(const QFont &font)

将绘图工具的字体设置为指定的font 。

后续调用的drawText()函数将使用此字体。文本颜色与画笔颜色相同。

如果设置的字体不可用,Qt会自动寻找最接近的字体。font()将返回通过setFont()设置的字体,而fontInfo()则返回实际使用的字体(两者可能相同)。

另请参阅 font()、drawText() 以及Settings 。

void QPainter::setLayoutDirection(Qt::LayoutDirection direction)

将绘图器在绘制文本时使用的布局方向设置为指定的direction 。

默认值为Qt::LayoutDirectionAuto ,该值将根据绘制的文本隐式确定方向。

另请参阅 QTextOption::setTextDirection()、layoutDirection()、drawText() 以及Settings 。

void QPainter::setOpacity(qreal opacity)

将绘图工具的不透明度设置为opacity 。该值应在0.0到1.0之间,其中0.0表示完全透明,1.0表示完全不透明。

在绘图工具上设置的不透明度将分别应用于每次绘图操作。填充形状和绘制其轮廓被视为独立的绘图操作。

另请参阅 opacity()。

void QPainter::setPen(const QPen &pen)

将绘图笔设置为指定的pen 。

pen 定义了如何绘制线条和轮廓,同时也定义了文本颜色。

另请参阅 pen()和Settings 。

[since 6.11] void QPainter::setPen(QPen &&pen)

这是一个重载函数。

该函数在 Qt 6.11 中引入。

void QPainter::setPen(Qt::PenStyle style)

将画笔设置为具有给定的style 、宽度为1以及黑色。

这是一个重载函数。

void QPainter::setPen(const QColor &color)

将画笔设置为样式Qt::SolidLine 、宽度1以及指定的color 。

这是一个重载函数。

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

如果 `on ` 为真,则将给定的渲染提示 `hint ` 设置到绘图器上;否则清除该渲染提示。

另请参阅 setRenderHints()、renderHints() 以及Rendering Quality 。

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

如果 `on ` 为真,则将给定的渲染提示 `hints ` 设置到绘图器上;否则清除渲染提示。

另请参阅 setRenderHint()、renderHints() 以及Rendering Quality 。

void QPainter::setTransform(const QTransform &transform, bool combine = false)

设置世界变换矩阵。如果combine 为真,则将指定的transform 与当前矩阵进行组合;否则,它将替换当前矩阵。

另请参阅 transform() 和setWorldTransform()。

void QPainter::setViewTransformEnabled(bool enable)

如果 `enable ` 为真,则启用视图变换;如果 `enable ` 为假,则禁用视图变换。

另请参阅 viewTransformEnabled() 和窗口-视口转换。

void QPainter::setViewport(const QRect &rectangle)

将绘图器的视口矩形设置为给定的rectangle ,并启用视图变换。

视口矩形是视图变换的一部分。视口定义了设备坐标系,而与其对应的window()则定义了逻辑坐标系。

默认视口矩形与设备的矩形相同。

另请参阅 viewport()、viewTransformEnabled() 以及“窗口-视口转换”。

void QPainter::setViewport(int x, int y, int width, int height)

将绘图器的视口矩形设置为以 (x,y) 为起点的矩形,并使用给定的width 和height 。

这是一个重载函数。

void QPainter::setWindow(const QRect &rectangle)

将绘图窗口设置为给定的rectangle ,并启用视图变换。

窗口矩形是视图变换的一部分。窗口指定逻辑坐标系,而与其对应的viewport()则指定设备坐标系。

默认窗口矩形与设备矩形相同。

另请参阅 window()、viewTransformEnabled() 以及“窗口-视口转换”。

void QPainter::setWindow(int x, int y, int width, int height)

将绘图器的窗口设置为以 (x,y) 为起点的矩形,并使用给定的width 和height 。

这是一个重载函数。

void QPainter::setWorldMatrixEnabled(bool enable)

如果enable 为真,则启用变换;如果enable 为假,则禁用变换。世界变换矩阵保持不变。

另请参阅 worldMatrixEnabled()、worldTransform() 以及Coordinate Transformations 。

void QPainter::setWorldTransform(const QTransform &matrix, bool combine = false)

设置世界变换矩阵。如果combine 为真,则指定的matrix 将与当前矩阵合并;否则,它将替换当前矩阵。

另请参阅 worldTransform()、transform() 和setTransform()。

void QPainter::shear(qreal sh, qreal sv)

将坐标系进行剪切,剪切参数为 (sh,sv)。

另请参阅 setWorldTransform() 和Coordinate Transformations 。

void QPainter::strokePath(const QPainterPath &path, const QPen &pen)

path 使用由pen

另请参阅 fillPath() 和Drawing 。

bool QPainter::testRenderHint(QPainter::RenderHint hint) const

如果已设置 `hint `,则返回 `true `;否则返回 `false`。

另请参阅 renderHints() 和setRenderHint()。

const QTransform &QPainter::transform() const

worldTransform() 的别名。返回世界变换矩阵。

另请参阅 setTransform() 和worldTransform()。

void QPainter::translate(const QPointF &offset)

将坐标系按给定的offset 进行平移;即,将给定的offset 加到各点上。

另请参阅 setWorldTransform() 和Coordinate Transformations 。

void QPainter::translate(const QPoint &offset)

将坐标系沿给定的offset 进行平移。

这是一个重载函数。

void QPainter::translate(qreal dx, qreal dy)

将坐标系沿向量 (dx,dy) 进行平移。

这是一个重载函数。

bool QPainter::viewTransformEnabled() const

如果启用了视图变换,则返回true ;否则返回false。

另请参阅 setViewTransformEnabled() 和worldTransform()。

QRect QPainter::viewport() const

返回视口矩形。

另请参阅 setViewport() 和setViewTransformEnabled()。

QRect QPainter::window() const

返回窗口矩形。

另请参阅 setWindow() 和setViewTransformEnabled()。

bool QPainter::worldMatrixEnabled() const

如果启用了世界变换,则返回true ;否则返回false。

另请参阅 setWorldMatrixEnabled()、worldTransform() 以及“坐标系”。

const QTransform &QPainter::worldTransform() const

返回世界变换矩阵。

另请参阅 setWorldTransform()。

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