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

}
相关推荐
阳光开朗_大男孩儿3 小时前
DBUS属性原理
linux·服务器·前端·数据库·qt
Alphapeople4 小时前
Qt Modbus
开发语言·qt
竹林海中敲代码4 小时前
Qt Creator 集成开发环境 常见问题
qt·qt工具常见问题
竹林海中敲代码8 小时前
Qt安卓开发连接手机调试(红米K60为例)
android·qt·智能手机
长沙红胖子Qt9 小时前
关于 Qt运行加载内存较大崩溃添加扩大运行内存 的解决方法
开发语言·qt·qt扩大运行内存
gopher95119 小时前
qt相关面试题
开发语言·qt·面试
三玖诶18 小时前
在 Qt 中使用 QLabel 设置 GIF 动态背景
开发语言·qt·命令模式
只对您心动20 小时前
【QT】实现TCP服务器,客户端之间的通信
linux·服务器·c语言·开发语言·c++·qt·tcp/ip
Austim小白21 小时前
QT消息对话框学习
qt·学习
You can do more1 天前
Qt Model/View之代理
qt