Qt:玩转QPainter序列四补充(裁剪家族)

前言

本文补充上篇缺失的裁剪家族。

正文

9.裁剪家族

QRegion clipRegion() const;
  • 功能 :返回当前的剪裁区域 (clip region)。剪裁区域限制了绘制操作的范围,只有在剪裁区域内的部分才会被绘制。
  • 返回值 :一个 QRegion 对象,表示当前的剪裁区域。
  • QPainterPath clipPath() const;
  • 功能 :返回当前的剪裁路径 (clip path),这是一个更精细的剪裁控制方式,相较于矩形或区域,可以使用任意形状的路径来进行剪裁。
  • 返回值 :一个 QPainterPath 对象,表示当前的剪裁路径。

我们需要先对QRegionQPainterPath有一个简单的了解。
QRegionQPainterPath 是 Qt 中用于定义和操作几何形状的两种数据类型。它们各有特点,主要用于不同的绘图和剪裁操作。

1. QRegion

QRegion 是一个表示二维区域的类,它的区域由一个或多个矩形组成。这些区域可以是简单的矩形、椭圆、或者这些基本形状的组合与差集。QRegion 常用于剪裁操作,以限制绘图的区域,确保绘制操作只影响指定的区域。

特点:
  • 基于矩形QRegion 的基本构建块是矩形。可以通过添加、相减、相交等操作组合矩形来构造更复杂的区域。
  • 快速操作 :由于它基于矩形操作,QRegion 的计算和操作速度非常快,非常适合用于需要高效剪裁的场景。
  • 整数坐标QRegion 使用整数坐标,因此它更适用于像素精确的操作,如窗口部件的剪裁。
主要用途:
  • 剪裁区域QRegion 最常见的用途是定义绘图的剪裁区域。通过设置剪裁区域,绘图操作将仅影响这些区域内的部分。
  • 区域检测QRegion 可以用于碰撞检测,判断一个点或一个矩形是否在区域内。
  • 窗口区域控制 :在一些平台上,QRegion 可以用来定义窗口的形状。
示例:
cpp 复制代码
QRegion region(QRect(10, 10, 50, 50));  // 创建一个矩形区域
region = region.united(QRegion(60, 60, 30, 30));  // 合并另一个矩形
2. QPainterPath

QPainterPath 是一个表示二维路径的类,路径可以包含直线段、曲线段、贝塞尔曲线等复杂的几何形状。QPainterPath 提供了比 QRegion 更灵活的绘图和剪裁功能。

特点:
  • 灵活性高QPainterPath 能够表示任意形状,包括直线、曲线、多边形、圆弧、贝塞尔曲线等。它的灵活性远超 QRegion
  • 浮点坐标QPainterPath 支持浮点坐标,这使得它适合需要精细控制的绘图操作,如抗锯齿绘制和路径动画。
  • 复杂路径QPainterPath 能够表示复杂的路径,适合用来绘制和填充不规则形状。
主要用途:
  • 路径绘制QPainterPath 常用于定义复杂的绘制路径,这些路径可以包括任意组合的线段和曲线。可以通过 QPainter::drawPath() 函数将路径绘制到设备上。
  • 剪裁路径 :与 QRegion 类似,QPainterPath 也可以用于剪裁操作,但它可以定义任意形状的剪裁路径,这对于需要精细剪裁的场景非常有用。
  • 填充规则QPainterPath 提供了不同的填充规则(如非零填充规则、奇偶填充规则),用于定义路径内部的填充方式。
示例:
cpp 复制代码
QPainterPath path;
path.moveTo(20, 20);  // 移动到起点
path.lineTo(80, 20);  // 画一条线到指定位置
path.arcTo(QRectF(80, 20, 40, 40), 0, 180);  // 画一个弧线
  • void setClipRect(const QRectF &, Qt::ClipOperation op = Qt::ReplaceClip);
  • 功能:设置剪裁矩形,限制绘制区域。这个矩形的范围之外的部分将不会被绘制。
  • 参数
    • QRectF &:表示剪裁区域的浮点数矩形。
    • Qt::ClipOperation op:指定剪裁操作,默认值为 Qt::ReplaceClip,表示用新的剪裁区域替换当前的剪裁区域。
  • NoClip:没有剪裁限制,绘图操作不受剪裁区域的影响。
  • ReplaceClip:用新区域替换当前的剪裁区域。
  • IntersectClip:新区域与当前的剪裁区域相交,绘图操作仅在相交区域内生效
void setClipRect(const QRect &, Qt::ClipOperation op = Qt::ReplaceClip);
  • 功能:设置剪裁矩形,使用整数坐标来指定剪裁区域。
  • 参数
    • QRect &:表示剪裁区域的整数矩形。
    • Qt::ClipOperation op:指定剪裁操作,默认值为 Qt::ReplaceClip
void setClipRegion(const QRegion &, Qt::ClipOperation op = Qt::ReplaceClip);
  • 功能 :设置剪裁区域 (clip region),使用 QRegion 对象来定义更复杂的剪裁区域。
  • 参数
    • QRegion &:表示剪裁区域的 QRegion 对象。
    • Qt::ClipOperation op:指定剪裁操作,默认值为 Qt::ReplaceClip
void setClipPath(const QPainterPath &path, Qt::ClipOperation op = Qt::ReplaceClip);
  • 功能 :设置剪裁路径 (clip path),使用 QPainterPath 对象定义任意形状的剪裁区域。
  • 参数
    • QPainterPath &path:表示剪裁路径的 QPainterPath 对象。
    • Qt::ClipOperation op:指定剪裁操作,默认值为 Qt::ReplaceClip
void setClipping(bool enable);
  • 功能:启用或禁用剪裁功能。如果禁用剪裁,则所有绘制操作都会无条件地应用,不受剪裁区域的限制。
  • 参数
    • enable:一个布尔值,true 表示启用剪裁,false 表示禁用。
bool hasClipping() const;
  • 功能:检查是否当前启用了剪裁。
  • 返回值 :一个布尔值,true 表示当前启用了剪裁,false 表示没有启用。
QRectF clipBoundingRect() const;
  • 功能:返回当前剪裁区域的边界矩形。这个矩形是包含所有剪裁内容的最小矩形。
  • 返回值 :一个 QRectF 对象,表示当前剪裁区域的边界矩形

示例一:

cpp 复制代码
void PaintWidget::paintEvent(QPaintEvent* event)
{
    Q_UNUSED(event);
    QPainter painter(this);
    QBrush brush;
    brush.setColor(Qt::green);
    brush.setStyle(Qt::SolidPattern);
    QPen pen(Qt::red);
    painter.setPen(pen);
    painter.setBrush(brush);
    painter.save();
    painter.drawRect(0,0,100,100);
    //使用裁剪区域
    QRegion region(QRect(100,100,50,50));
    painter.setClipRegion(region);
    painter.drawRect(100,100,100,100);
    //使用圆形裁剪区域
    QRegion region2(QRect(200,200,50,50),QRegion::Ellipse);
    painter.setClipRegion(region2);
    painter.drawRect(100,100,150,150);
    if (painter.hasClipping()) {
        painter.restore();
        painter.drawText(300,50,"当前使用了裁剪");
        //禁用裁剪功能
        painter.setClipping(false);

        //使用圆形裁剪区域
        QRegion region3(QRect(300,300,50,50),QRegion::Ellipse);
        painter.setClipRegion(region3);
        painter.drawRect(250,250,100,100);

    }
}

示例二:

cpp 复制代码
void PaintWidget::paintEvent(QPaintEvent* event)
{
    Q_UNUSED(event);
    QPainter painter(this);

    // 设置背景色
    painter.fillRect(rect(), Qt::white);

    // 定义矩形剪裁区域
    QPainterPath rectPath;
    rectPath.addRect(10, 10, 100, 100);

    // 定义圆形剪裁区域
    QPainterPath circlePath;
    circlePath.addEllipse(120, 10, 100, 100);

    // 定义三角形剪裁区域
    QPainterPath trianglePath;
    trianglePath.moveTo(230, 110);
    trianglePath.lineTo(280, 10);
    trianglePath.lineTo(330, 110);
    //关闭当前的子路径。将当前子路径的最后一个点和第一个点连接起来,从而形成一个封闭的图形
    trianglePath.closeSubpath();

    // 设置剪裁区域并绘制内容
    painter.setClipPath(rectPath, Qt::ReplaceClip);
    painter.fillRect(rect(), Qt::red);

    painter.setClipPath(circlePath, Qt::ReplaceClip);
    painter.fillRect(rect(), Qt::green);

    painter.setClipPath(trianglePath, Qt::ReplaceClip);
    painter.fillRect(rect(), Qt::blue);

}
相关推荐
kiiila6 小时前
【Qt】对象树(生命周期管理)和字符集(cout打印乱码问题)
开发语言·qt
黄金右肾9 小时前
Qt之数据库使用(十四)
sql·qt·sqlite·database
杨德杰11 小时前
QT多媒体开发(一):概述
qt·音视频·多媒体
小王爱吃月亮糖11 小时前
QT开发【常用控件1】-Layouts & Spacers
开发语言·前端·c++·qt·visual studio
864记忆11 小时前
关于opencv、Qt、msvc编译器之间的关系
人工智能·qt·opencv
矛取矛求18 小时前
QT的前景与互联网岗位发展
开发语言·qt
Leventure_轩先生18 小时前
[WASAPI]从Qt MultipleMedia来看WASAPI
开发语言·qt
晓纪同学1 天前
QT-简单视觉框架代码
开发语言·qt
威桑1 天前
Qt SizePolicy详解:minimum 与 minimumExpanding 的区别
开发语言·qt·扩张策略
飞飞-躺着更舒服1 天前
【QT】实现电子飞行显示器(简易版)
开发语言·qt