Qt的QPainter详细介绍

这篇文章来源于自己在学习Qt的QPainter的过程中自己总结的QPainter的知识点。本人文笔有限,如有错误,大家评论区评论,一起学习,共同成长。

一、QPainter介绍

QPainter是Qt框架中的一个类,主要用于在各种设备上进行2D图形绘制,如窗口、位图、打印设备等。它提供了一系列绘图函数,可以实现绘制点、线、曲线、形状、文本、图像以及复杂的绘画操作。

使用QPainter进行绘图的基本步骤如下:

  1. 创建一个QPainter对象。
  2. QPainter与要绘图的设备(如QPixmapQImageQWidget)关联起来,通过调用begin()函数。
  3. 使用QPainter提供的绘图函数进行绘图,如drawLine()drawRect()drawText()等。
  4. 绘制完毕后,调用end()函数结束绘图并释放相关资源。

当你需要在自己定义的界面上面执行各种绘画操作时,使用这个类就行绘制,毕竟QT直接提供的Ui控件里面还是比较少的,如果你想实现自己的控件,可是重写里面的虚函数,进行绘制自己的控件。

使用方法:

QPainter painter(this); // 如果是在QWidget上绘图
painter.begin(myPixmap); // 如果是在QPixmap上绘图
painter.setPen(Qt::red); // 设置画笔颜色为红色
painter.drawRect(10, 10, 100, 100); // 绘制一个矩形
painter.drawText(50, 50, "Hello, Qt!"); // 绘制文本
painter.end();

二、构造函数

1、QPainter::QPainter(QPaintDevice *device)

QPainter::QPainter(QPaintDevice *device) 是 QPainter 类的一个构造函数,用于初始化一个新的 QPainter 对象,并将其与指定的 QPaintDevice 相关联。QPaintDevice 是所有可被 QPainter 绘制的设备的基类,它可以是一个窗口(例如 QWidget)、一个位图 (QPixmap 或 QImage) 或其他可绘制表面。当创建一个 QPainter 对象时,通过传入一个指向 QPaintDevice 的指针作为参数,就可以准备在这个设备上进行绘图操作了。然而,这只是准备阶段,实际的绘图工作(即上下文的激活)需要通过调用 QPainter::begin() 函数来开始。

示例:

// 假设我们有一个 QWidget 或 QPixmap 对象
QPixmap pixmap(width, height);
// 创建 QPainter 并关联到 QPixmap 上
QPainter painter(&pixmap);
// 确保绘图上下文已打开
if (!painter.isActive()) {
    painter.begin(&pixmap);
}
// 开始绘图操作...
painter.fillRect(0, 0, width, height, Qt::white);
painter.drawLine(0, 0, width, height);
// ...完成绘图后,关闭绘图上下文
painter.end();

注意,在Qt5之后,通常情况下可以直接在构造函数中初始化并开始绘图,但如果遇到设备不可用或者其他情况,仍然需要检查 painter.isActive() 的返回值并在必要时显式调用 begin() 函数。

2、QPainter::QPainter()

QPainter::QPainter() 是 QPainter 类的一个默认构造函数,它创建了一个没有关联任何 QPaintDevice 的画家对象。这个构造函数主要用于临时存储绘图状态或者在确定绘图设备之前先设置绘图属性等用途。

由于没有关联具体的绘图设备,使用此构造函数创建的 QPainter 对象并不能直接进行绘图操作。若要进行实际的绘图,必须后续调用 QPainter::begin(QPaintDevice*) 函数,将 QPainter 对象与一个有效的 QPaintDevice(如 QWidgetQPixmap 或 QImage)相关联。

// 创建一个未关联绘图设备的 QPainter 对象
QPainter painter;
// 获取绘图设备,比如一个 QWidget 或 QPixmap
QPixmap pixmap(width, height);
// 将 QPainter 与绘图设备关联并开始绘图
painter.begin(&pixmap);
// 开始执行绘图操作...
painter.fillRect(0, 0, width, height, Qt::white);
painter.drawLine(0, 0, width, height);
// 完成绘图后,结束绘图上下文
painter.end();

注意,如果可能,通常建议在构造 QPainter 时直接关联绘图设备,这样能简化代码且更直观地表达意图。上述例子中的构造方式常用于需要动态决定绘图设备或者在构造时绘图设备尚未准备好等情况。

3、QPainter::~QPainter()

析构函数就不讲了,就是为了销毁对象,防止出现内存泄漏和其他情况。

4、const QBrush &QPainter::background() const

const QBrush &QPainter::background()用于获取当前 QPainter 对象的背景刷(brush)。

在Qt的图形绘制系统中,QPainter 用于在各种 QPaintDevice(如窗口、视图、位图等)上执行绘画操作。背景刷定义了绘画区域的填充样式,例如纯色、渐变或者图案。

这个函数原型表明它返回的是一个指向 QBrush 的常量引用,这意味着你可以读取当前画笔的背景样式,但不能通过此函数修改背景刷。如果你想设置 QPainter 的背景刷,应该使用 QPainter::setBackground() 函数。

注意,不是所有的 QPaintDevice 都支持设置或获取背景刷,这主要取决于具体的绘图设备及其用途。在某些情况下,可能需要直接设置绘图设备本身的背景属性而非画笔的背景属性。

QPainter painter(this); // 创建一个在Widget 上绘图的 QPainter 对象

 // 设置画笔的背景颜色为蓝
 QBrush backgroundBrush(QColor(0, 0, 255)); // 蓝色背景刷
 painter.setBackground(backgroundBrush);

  // 获取当前设置的背景刷并验证
  const QBrush &currentBackground = painter.background();
  if (currentBackground.color() == QColor(0, 0, 255))
 {
     qDebug() << "当前背景刷颜色确实是蓝色";
 }

在这个例子中,我们首先创建了一个 QPainter 对象,并设置了它的背景刷为蓝色。然后,我们调用 painter.background() 来获取当前画笔的背景刷,并检查其颜色是否与预期一致。由于之前刚设置了蓝色背景刷,因此这里的检查应当返回正确的背景颜色。不过,在实际应用中,这样的验证步骤通常是多余的,除非你在代码的其他部分对背景刷进行了更改,需要确认当前设置的状态。

5、Qt::BGMode QPainter::backgroundMode() const

在Qt库中的QPainter类中,backgroundMode()函数用于获取画家(painter)对象当前的背景模式。这个模式决定了当进行绘画操作时,背景是如何处理的。Qt::BGMode 是一个枚举类型,包含了两种可能的背景模式:

  • Qt::TransparentMode: 表示画家在绘画时不使用任何背景,即绘画区域下的像素将保持不变,呈现透明效果。

  • Qt::OpaqueMode: 表示画家在绘画时会先填充一个背景色或者使用背景刷来填充绘画区域,然后再进行绘画操作。


QPainter painter(this);

    Qt::BGMode bgMode = painter.backgroundMode();

    if (bgMode == Qt::TransparentMode) {
        qDebug() << "The painter's background mode is set to transparent.";
    } else if (bgMode == Qt::OpaqueMode) {
        qDebug() << "The painter's background mode is set to opaque.";
    }

    // 若要更改背景模式
    painter.setBackgroundMode(Qt::OpaqueMode);

在上述代码中,backgroundMode()函数用于获取painter对象的背景模式,而setBackgroundMode()函数则用于设置新的背景模式。通过调整背景模式,可以控制绘画时如何处理底层已有的像素信息。

6、bool QPainter::begin(QPaintDevice *device)

在Qt框架中,QPainter::begin(QPaintDevice *device) 是一个成员函数,用于初始化并开始在一个指定的绘图设备(QPaintDevice)上进行绘画操作。QPainter 类是用来在各种支持绘图的设备(如窗口、位图、打印设备等)上进行二维图形绘制的核心类。

参数说明:

  • QPaintDevice *device:指向绘图设备的指针。QPaintDevice 可以是QWidget、QPixmap、QImage或其他支持绘图的Qt对象。

函数功能:

  • 开始一个新的绘图操作周期。在对任何设备进行绘图之前,必须首先调用 begin() 函数,这会将 QPainter 对象与指定的绘图设备关联起来。

返回值:

  • 返回布尔值,如果成功开始绘图,则返回 true;否则返回 false,这通常意味着提供的绘图设备无效或者当前环境不支持绘图

QPixmap pixmap(200, 200);
QPainter painter;
if (!painter.begin(&pixmap)) {
    // 处理错误,无法开始绘图
} else {
    // 在这里进行绘图操作...
    painter.drawLine(0, 0, pixmap.width(), pixmap.height());
    painter.end(); // 绘制完成后,记得调用end()来结束绘画周期,并释放资源
}

在这个例子中,我们创建了一个 QPixmap 对象作为绘图设备,并尝试用 QPainter 在其上开始绘画。如果 begin() 成功,就可以执行绘图操作,最后别忘了调用 painter.end() 来结束绘图周期。

7、void QPainter::beginNativePainting()

QPainter::beginNativePainting() 是Qt库中的一个函数,它允许开发者直接访问底层绘图系统(例如Windows GDI、Mac OS X Quartz或者X11),进行原生的、非Qt抽象层的绘图操作。

功能描述: 当在QPainter对象上调用此函数后,Qt将暂时停止自身的绘图管理,进入“原生绘图模式”。这意味着你可以使用操作系统特定的API来进行绘图,从而利用这些API可能提供的额外性能或特性。一旦调用了 beginNativePainting(),直到调用 endNativePainting() 之前,所有通过Qt QPainter 进行的标准绘图操作都将被忽略。

使用场景:

  • 当需要进行大量数据的高速渲染,且Qt的绘图引擎不足以满足性能需求时;
  • 当需要使用特定于平台的功能或效果,而Qt API并未提供时。

注意点:

  • 使用原生绘图时,要确保你知道如何正确使用目标平台的绘图API,并负责处理绘图状态和资源的管理。
  • 必须配对调用 beginNativePainting() 和 endNativePainting() 函数,以确保Qt绘图系统的正常恢复。
QPainter painter(this); // 假设"this"是一个继承自QPaintDevice的Qt窗口组件
painter.beginNativePainting();

// 在这里进行原生绘图操作,例如使用Win32 GDI、Cocoa或XLib等
// ...

painter.endNativePainting();

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

注:里面参数的QRectF、QRect等都是为了描述绘画区域的矩形。下面多个成员函数皆是如此,就不单独的拎出来解释了。

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

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

x:绘画矩形的左上角X轴坐标,y:绘画矩形的左上角Y轴坐标

w:绘画矩形的宽度。 h:绘画矩形的高度

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

与上面的相同,重载函数,实现的功能是一样的,只不过是传参不一样,

 QTextOption &option = QTextOption()

QTextOption &option = QTextOption() 是一个函数参数的默认值设定。QTextOption 是 Qt 中的一个类,用于存储和控制文本布局的各种选项,如对齐方式、换行模式、阅读方向等。

在调用函数时,如果没有显式传入 QTextOption 对象,就会使用默认构造函数 QTextOption() 创建一个空的文本选项对象,其默认设置通常包括左对齐和无换行等。

QTextOption option;
option.setAlignment(Qt::AlignCenter);

QRectF rect = boundingRect("Hello, World!", option);

此函数用于计算你在一个矩形里面绘制文字需要的矩形范围,你需要传入目标矩形的位置和大小,文字的对齐标志,以及所要绘制的文字。

flags主要标志:

// 创建或获取一个QPainter实例
QPainter painter;

// 设置字体和其他绘图属性
QFont font;
font.setFamily("Arial");
font.setPointSize(12);
painter.setFont(font);

// 要计算边界的文本
QString text = "Sample Text";

// 获取字体测量信息


// 计算文本的边界矩形,根据flags调整对齐方式
QRectF rectangle(QPoint(0, 0), QSize(200, 100)); // 假设的矩形区域
Qt::AlignmentFlag alignmentFlag = Qt::AlignCenter; // 示例对齐标志
QRectF boundingRect = painter.boundingRect(rectangle, alignmentFlag, text);

// boundingRect现在包含了文本在指定矩形内按照指定对齐方式绘制时所需的最小边界矩形

9、const QBrush &QPainter::brush() const

const QBrush &QPainter::brush() const 是Qt库中的一个成员函数,该函数属于 QPainter 类。QPainter 是Qt中的一个核心图形类,用于在各种设备上(如窗口、位图等)进行2D绘图操作。

函数解释:

此函数为只读(const)成员函数,其作用是从当前的 QPainter 对象中获取当前设置的画刷(brush)。QBrush 在Qt中是用来定义填充形状内部颜色和纹理的图形对象,它可以是纯色、渐变色或者图案

  • 返回的是一个指向 QBrush 对象的常量引用,表示当前画家所使用的画刷属性。

这意味着当你调用此函数时,不会修改 QPainter 对象的状态,而是仅仅获取并返回当前正在使用的画刷设置,以便开发者能够检查或复制当前的填充样式。

10、QPoint QPainter::brushOrigin() const

QPoint QPainter::brushOrigin() const 是Qt库中的另一个 QPainter 类的成员函数。这个函数同样为只读(const)成员函数,它用于获取当前画刷(brush)的原点位置。

函数解释:

在Qt的图形系统中,QPainter 的 brushOrigin() 函数允许开发者获取当前画刷起始点的位置,这对于某些复杂的绘图操作比如使用自定义纹理或图案进行填充时非常有用。当设置了非默认的画刷原点后,画刷的纹理或图案会从该点开始应用到被绘制的形状上。

  • 返回的是一个 QPoint 对象,表示当前画刷相对于绘图区域的原点坐标。

通过调用此函数,开发者可以了解或改变绘制时画刷起点的位置,进而影响图形的填充效果。

11、QRectF QPainter::clipBoundingRect() const

QRectF QPainter::clipBoundingRect() const 是Qt图形视图框架中 QPainter 类的一个成员函数。这个函数用于获取当前剪裁区域的有效边界矩形。

函数解释:

在图形绘制过程中,QPainter 提供了剪裁区域的功能,即只有在剪裁区域内才进行实际的绘图操作。clipBoundingRect() 函数是用来查询当前设置在 QPainter 上的剪裁区域所限定的最大边界矩形。

  • 返回一个 QRectF 对象,表示当前剪裁区域的有效边界矩形。这个矩形是所有当前剪裁路径组合起来形成的最小包围矩形。

通过调用此函数,开发者能够了解到当前绘图上下文中的有效绘图区域大小和位置,这对于管理复杂绘图场景中的可见区域特别有用。如果你之前设置了剪裁区域,例如通过 QPainter::setClipRect() 或 QPainter::setClipPath() 等函数,则可以通过 clipBoundingRect() 来获取实际生效的剪裁范围。

#include <QPainter>
#include <QRectF>
#include <QDebug>

void drawClippedRectangle(QPainter &painter, QPointF center, qreal width, qreal height) {
    // 创建一个矩形并居中于给定坐标
    QRectF rect(center.x() - width / 2, center.y() - height / 2, width, height);

    // 设置剪裁区域,这里假设我们只允许在一个大矩形内绘制
    QRectF clippingRect(0, 0, 500, 500);
    painter.setClipRect(clippingRect);

    // 绘制矩形
    painter.fillRect(rect, Qt::red);

    // 获取当前剪裁区域的有效边界矩形
    QRectF clippedBounds = painter.clipBoundingRect();

    qDebug() << "Clipped bounding rectangle: " << clippedBounds;

    // 如果rect矩形部分或全部在剪裁区域内,则clippedBounds会反映这一情况
}

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 假设我们有一个QWidget或者QPixmap等可以绘图的对象
    QWidget widget;
    widget.resize(800, 600);

    QPainter painter(&widget);

    // 调用函数来演示clipBoundingRect()的使用
    drawClippedRectangle(painter, QPointF(400, 300), 200, 150);

    widget.show();

    return app.exec();
}

在这个例子中,我们首先创建了一个 QPainter 对象并在一个窗口上绘图。然后定义了一个要绘制的矩形,并设定一个全局剪裁矩形。通过调用 painter.setClipRect(clippingRect),我们限制了绘图的有效区域。最后,我们调用 painter.clipBoundingRect() 来获取当前剪裁后的有效边界矩形,并打印出来。这有助于理解实际被剪裁后能显示图形的区域大小。注意,在真实程序中,剪裁区域和绘制区域可能会动态变化。

12、QPainterPath QPainter::clipPath() const

QPainter::clipPath() 是Qt库中的一个方法,它用于获取当前QPainter对象的剪裁路径(而不是设置剪裁区域)。剪裁路径允许更复杂的不规则形状作为剪裁区域,而不局限于简单的矩形。

下面是一个使用 QPainter::clipPath() 和 QPainter::setClipPath() 的基本示例:

#include <QPainter>
#include <QPainterPath>
#include <QRectF>
#include <QDebug>

void drawClippedShape(QPainter &painter, QPointF center, qreal radius) {
    // 创建一个圆形路径
    QPainterPath circlePath;
    circlePath.addEllipse(center, radius, radius);

    // 设置剪裁路径
    painter.setClipPath(circlePath);

    // 创建一个矩形并居中于给定坐标
    QRectF rect(center.x() - 100, center.y() - 50, 200, 100);
    
    // 绘制矩形,超出圆形的部分将不会被绘制
    painter.fillRect(rect, Qt::red);

    // 获取当前剪裁路径的有效边界
    QPainterPath clippedPath = painter.clipPath();

    // 打印出剪裁路径的信息
    qDebug() << "Clipped path: " << clippedPath;
}

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget widget;
    widget.resize(800, 600);

    QPainter painter(&widget);

    drawClippedShape(painter, QPointF(400, 300), 150);

    widget.show();

    return app.exec();
}

在这个例子中,我们首先创建了一个 QPainterPath 对象并添加了一个圆形路径。接着,我们使用 painter.setClipPath() 将该路径设置为绘图器的剪裁区域。当我们在剪裁区域内绘制矩形时,只有与剪裁路径(圆形)相交的部分会被绘制出来。最后,我们调用 painter.clipPath() 来获取当前的剪裁路径,并打印其信息。由于clipPath()是获取操作而非设置,所以通常在需要检查或重用当前剪裁区域的情况下使用它。

13、QRegion QPainter::clipRegion() const

QPainter::clipRegion() 是Qt图形框架中的一个函数,它返回当前 QPainter 对象的剪裁区域作为一个 QRegion 对象。剪裁区域定义了在后续绘图操作中可见的部分,即所有绘图操作仅限于剪裁区域内部。

当你在 QPainter 上设置了剪裁路径 (QPainter::setClipPath()) 或直接设置了剪裁区域 (QPainter::setClipRegion()) 后,可以调用此函数来获取当前生效的剪裁区域。这个剪裁区域可以是任意形状,但 QRegion 通常用来表示由多个矩形构成的复杂区域。

以下是使用 QPainter::clipRegion() 的简单示例:

#include <QPainter>
#include <QRegion>
#include <QRect>
#include <QDebug>

void printClipRegion(QPainter &painter) {
    // 获取当前的剪裁区域
    QRegion clipRegion = painter.clipRegion();

    // 输出剪裁区域包含的矩形数量和总面积
    qDebug() << "Clip region contains" << clipRegion.rectCount() << "rectangles";
    foreach (const QRect &rect, clipRegion.rects()) {
        qDebug() << "Rectangle: " << rect;
    }

    // 可以进一步处理clipRegion,例如合并其他区域或者应用到新的画布上
}

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget widget;
    widget.resize(800, 600);

    QPainter painter(&widget);

    // 假设设置了一个剪裁区域
    QRegion customRegion({
  {100, 100}, {300, 300}}, QRegion::Ellipse);
    painter.setClipRegion(customRegion);

    // 获取并打印当前的剪裁区域
    printClipRegion(painter);

    widget.show();

    return app.exec();
}

在这个示例中,我们首先创建了一个 QRegion 对象并设置为圆形剪裁区域,然后通过 QPainter::clipRegion() 获取这个剪裁区域,并打印出其中包含的矩形信息。请注意,尽管我们设置的是一个圆形剪裁,但在 QRegion 中它将被近似表达为一系列矩形。

QRegion 是Qt框架中的一个类,它在Qt GUI模块中用于表示屏幕上的一个区域或一组相连的不规则区域。QRegion 主要用于窗口管理、绘图剪裁以及视图更新等场景,它可以精确地描述屏幕上任意形状和大小的区域,这些区域通常是通过合并、相减或相交矩形来构建的。

在Qt应用程序中,QRegion 类的主要用途包括:

  1. 绘图剪裁

    • 使用 QPainter::setClipRegion() 方法可以将 QRegion 设置为 QPainter 的剪裁区域,这样之后所有的绘图操作都将被限制在该区域内,超出区域的部分将不会被绘制。
  2. 窗口管理

    • 在窗口系统级别,QRegion 可用于定义窗口的可见部分,比如窗口的一部分需要透明或特殊处理时。
  3. 视图刷新

    • 当只需要更新窗口或控件的部分区域时,可以通过 QWidget::repaint() 函数传递一个 QRegion 对象,指定需要重新绘制的确切区域,从而提高性能,避免不必要的全窗口重绘。
  4. 形状构建

    • QRegion 可以从简单的矩形、多边形或者更复杂的几何形状构建,支持非矩形区域的描述,如圆形、椭圆或其他复合形状。
  5. 区域操作

    • 提供了一系列区域操作的方法,如合并 (unite()), 交集 (intersect()), 相减 (subtract()) 和异或 (eor()) 等,允许对多个区域进行组合和运算。

例如,你可以创建一个 QRegion 来代表一个窗口或控件内需要重绘的特定形状区域,或者限制 QPainter 在某个复杂形状内进行绘制,这些都是 QRegion 在实际开发中常见的应用场景。

14、QTransform QPainter::combinedTransform() const

在Qt图形视图框架中,QPainter::combinedTransform() 是一个成员函数,它返回当前QPainter对象的组合变换矩阵。这个组合变换包含了所有应用到画笔上的平移、缩放、旋转等几何变换效果。

当你使用 QPainter 进行绘制时,可能已经调用了诸如 translate()scale(), 或 rotate() 等方法对画布进行了变换操作。每次调用这些方法都会累加到 QPainter 内部的变换矩阵上。combinedTransform() 就是用来获取并返回这个累加后的整体变换矩阵的,返回类型是 QTransform

QTransform 是 Qt 中用于描述2D几何变换的类,它可以用来做各种线性和平面仿射变换。

QPainter painter(this); // 假设正在给一个 QWidget 绘制
painter.translate(50, 50); // 平移坐标系
painter.rotate(45); // 旋转坐标系
QTransform transform = painter.combinedTransform(); // 获取当前的组合变换矩阵

15、QPainter::CompositionMode QPainter::compositionMode() const

在Qt图形库中,QPainter::compositionMode() 是一个成员函数,用于获取当前QPainter对象的合成模式(Composition Mode)。合成模式决定了当新的像素颜色被绘入目标表面时,新颜色如何与已存在的背景颜色结合的方式。

QPainter::CompositionMode 枚举类型定义了一系列不同的合成模式,例如:

  • CompositionMode_SourceOver(默认模式):新像素颜色覆盖在原有颜色之上,但允许原背景透过新像素的透明部分。
  • CompositionMode_Clear:清除目标区域的颜色。
  • CompositionMode_Source:仅绘制源像素,忽略目标像素。
  • CompositionMode_Destination:保留目标像素,忽略源像素。
  • CompositionMode_SourceIn:只显示源像素与目标像素重叠的部分。
  • 等等...

通过调用 QPainter::compositionMode() 函数,你可以得到当前设置的合成模式

16、QPaintDevice *QPainter::device() const

Painter::device() 是Qt框架中的一个成员函数,它是从 QPainter 类调用的,其作用是返回当前 QPainter 对象关联的 QPaintDevice 指针。

QPaintDevice 是所有可被 QPainter 绘制的设备的基类,它可以是一个窗口、图像、打印机或其他任何能够接受和展示图形输出的实体。当你创建一个 QPainter 对象并开始在某个设备上绘图时,这个设备就会与 QPainter 关联起来。

具体代码示例

QPainter painter;
// 假设我们正在一个QWidget或者QImage上绘图
QWidget *widget = new QWidget();
painter.begin(widget); // 或者 painter.begin(&image);

// 获取当前QPainter关联的绘图设备
QPaintDevice *device = painter.device();

// 使用完后记得结束绘图操作
painter.end();

在这个例子中,painter.device() 将会返回与 painter 相关联的 QWidget 的指针。这一功能在需要了解绘图上下文或者需要对绘图设备本身进行特定操作时十分有用。

17、const QTransform &QPainter::deviceTransform() const

QPainter::deviceTransform() 是Qt库中的一个成员函数,它属于 QPainter 类。这个函数用于获取当前 QPainter 对象在其关联的 QPaintDevice(绘图设备)上的设备转换矩阵。

当我们在不同的坐标系统之间绘图或者应用了各种变换(如缩放、旋转、平移等)时,deviceTransform() 返回的是当前绘图环境相对于底层绘图设备的实际坐标变换。这意味着它反映了所有应用于 QPainter 的累积变换效果。

使用此函数可以获取并分析当前绘图操作的几何变换状态,这对于复杂的图形处理和理解图形最终如何显示在屏幕上是非常有帮助的。返回值是一个常量引用到 QTransform 对象,因此不能直接修改,但可以用来复制或者进一步分析变换矩阵。

下面进入绘画的成员函数,你可以完成各种各样的绘画操作。

有些重载函数,只介绍一种方法就行,其他的只是传参不一样而已,比如QRect、QRectF、(int x,int y int width,int height)其目的都是为了传入一个矩形范围供使用。

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

QPainter::drawArc(const QRectF &rectangle, int startAngle, int spanAngle) 是 Qt 图形视图框架中 QPainter 类的一个成员函数,用于在给定矩形区域内绘制一段圆弧。

函数参数说明:

  • const QRectF &rectangle: 指定要绘制圆弧的矩形区域。这个矩形框定了圆弧所在的椭圆边界,其中椭圆的中心位于矩形的中心,矩形的宽高分别对应椭圆的两个半径。

  • int startAngle: 圆弧的起始角度,以度数表示,逆时针方向为正。0度代表从水平右侧开始(3点钟方向),角度会按照逆时针方向增加。

  • int spanAngle: 圆弧所跨越的角度范围,同样以度数表示。正值表示逆时针方向,负值表示顺时针方向。例如,如果 spanAngle 为 90,则将绘制四分之一圆形的圆弧。

通过调用此函数,QPainter 将在指定矩形内按指定的起始角度和跨度角度绘制一段椭圆弧。这个功能通常用于创建饼状图、进度条或其他需要部分圆弧形状的用户界面元素。

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

注:为什么要乘以16.你可以理解为QT当中将1度划分了16份,为了便于更加精确的绘画。

重载函数:

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

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

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

QPainter::drawChord(const QRectF &rectangle, int startAngle, int spanAngle) 同样是 Qt 图形视图框架中 QPainter 类的一个成员函数,它与 drawArc() 函数类似,但在绘制圆弧的基础上还会闭合这段圆弧,形成一个和弦(chord)形状。

参数含义与 drawArc() 函数相同:

  • const QRectF &rectangle: 定义了要绘制和弦的矩形区域,该矩形框定了包含和弦的椭圆边界。

  • int startAngle: 和弦起始的角度,单位是度,逆时针方向为正。起点同样是从矩形对应的椭圆水平右侧开始(即3点钟位置)。

  • int spanAngle: 和弦所覆盖的角度范围,同样以度数表示,正负值决定了角度的旋转方向。

当调用此函数时,QPainter 不仅会在指定矩形内按指定的起始角度和跨度角度绘制一段椭圆弧,而且还会连接弧线的两端,形成一个闭合的多边形形状。这种图形常用于制作仪表盘指示器、图形按钮等具有封闭扇形区域的可视化组件。

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

重载函数:

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

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

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

QPainter::drawConvexPolygon(const QPointF *points, int pointCount) 是Qt图形库中的 QPainter 类的一个成员函数,用于绘制凸多边形。

参数说明如下:

  • *const QPointF points: 这是一个指向 QPointF 对象数组的指针,其中包含了构成凸多边形的所有顶点坐标。QPointF 是Qt中的一个类,用来表示二维空间中的点,包含两个浮点数成员变量(x和y坐标)。

  • int pointCount: 表示顶点的数量,即构成多边形的点有多少个。这些点按照顺序连接起来,形成了一个多边形,且这个多边形必须是凸的,即任意两点之间的连线

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值