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

news2024/12/28 20:35:52

前言

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

正文

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 可以用来定义窗口的形状。
示例:
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 提供了不同的填充规则(如非零填充规则、奇偶填充规则),用于定义路径内部的填充方式。
示例:
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 对象,表示当前剪裁区域的边界矩形

示例一:

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

    }
}

在这里插入图片描述

示例二:

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

}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2076518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【c语法】##__VA_ARGS__与__VA_ARGS__

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 引言__VA_ARGS__ 引言 在调试过程中,我们经常会自定义打印,比如日志信息的输出,这时就会用VA_ARGS,接下来详细讲解! VA_ARGS __VA_ARGS__是C语言设定…

数据展现新方式,Excel子弹图制作全攻略!

在做数据汇报时,如何让你的报告脱颖而出,瞬间吸引老板和同事的注意力?答案就是子弹图!今天,我们就来教你如何利用Excel这个强大的工具,轻松制作出专业又美观的子弹图,不论你是数据小白还是职场老…

sqli-labs靶场通关攻略(31-35关)

第31关( ") 闭合) 查数据库 ?id") union select 1,2,database() -- 查表 ?id") union select 1,2,group_concat(table_name) from information_schema.tables where table_schemasecurity-- 查列 ?id") union select 1,2,gro…

量化交易backtrader实践(四)_评价统计篇(2)_评价输出

上节回顾 上一节我们对backtrader内置的一堆评价指标进行了实践,从视觉上对这些评价指标的输出参数有了个大概的了解。接下来,我们在循环对多支股票或多个策略进行回测的时候,就可以将评价的一些值进行输出了,这样就能对于股票和…

建筑企业如何搭建数据仓库?做好这三步,大幅节约企业成本!

在当今这个数据驱动的时代,建筑企业正面临着前所未有的挑战和机遇。随着项目规模的扩大和市场环境的复杂化,如何有效管理和分析海量数据,已经成为提升企业竞争力的关键。数据仓库作为企业数据管理的核心,不仅能够整合分散的数据资…

攻防世界 reverse_re3

前言:做题笔记。 下载解压 查壳。 64ida 打开 查找字符并跟进 wasd一看,这题就是关于迷宫的题。跟进看看。 懵。。。不过还是得仔细看看。 观察发现。 进去看看。 然后最开始,因为数据太多把我卡住了。。。 回过头仔细看看。 猜测dword_202…

企业建站技术路线探索

前言 企业站是指企业或公司创建的官方网站,用于展示企业信息、产品和服务。它通常包括公司简介、产品或服务介绍、联系方式、新闻更新等内容。企业站的目的是提升品牌形象、提供客户服务和促进业务发展。在跨境贸易中,企业建站尤为关键,因为…

数据库集群技术

源码安装mysql mysql.com [https://downloads.mysql.com/archives/community/]: 官网下载 安装依赖性: [rootmysql-node2 ~]# dnf install cmake gcc-c openssl-devel \ ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el9_4.x86_64.rpm rpcgen.x86_64 下载并解压源…

Netty系列-1 NioEventLoopGroup和NioEventLoop介绍

背景 从本文开始开启一个新的专题Netty系列,用于收集Netty相关的文章,内容包含Netty的使用方式、运行原理等。 基于io.netty:netty-all:4.1.49.Final版本进行介绍 1.NioEventLoopGroup 介绍NioEventLoopGroup之前,有几个相关的组件需要提前…

idea导入maven项目(别人的项目)爆红

作为一个经常学习交流的人,或者工作需要,我们都或多或少会把别人写好的代码拷贝过来学习或编辑,大多数时候都是把整个项目拿过来;但是往往把代码拿到之后放在自己电脑用 idea 打开的时候就会出现 pom.xml 文件红线报错,然后倒入的…

大模型企业应用落地系列》基于大模型的对话式推荐系统》技术架构设计全攻略

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 大模型企业应用落地系列全貌基于大模型的对话式推荐系统》技术架…

如何使用ssm实现投稿系统+vue

TOC ssm231论文投稿系统vue 系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,…

软件测试 | 概念(1)

目录 前言 需求的概念 开发模型 软件的生命周期 常见开发模型 瀑布模型 螺旋模型 增量模型,迭代模型 敏捷模型 Scrum模型 测试模型 V模型 W模型(双V模型) 前言 测试:验证软件的特性是否满足用户的需求。 用户的需求…

vue3前端界面布置到服务器,使用户能用网址访问到界面

1.下载Nginx: nginx: download 2.下载好的Nginx解压缩, 在解压缩的文件夹下找到conf > nginx.conf,修改nginx.conf中的server,配置服务器的ip地址和端口号 3.执行npm run build命令,vue生成的dist下的文件全部放置在…

基于微信小程序的行李寄存管理系统的设计与实现(论文+源码)_kaic

基于微信小程序的行李寄存管理系统的设计与实现(论文源码)_kaic 摘 要 人们外出旅行的时候,经常会需要到行李寄存的服务。行李寄存处在全国各地都很常见。现存的行李寄存方式很传统,适合小规模的行李寄存,当行李数量较多时,就…

【领域驱动设计 打通DDD最小闭环】三 模型的建立-领域建模

本篇BLOG为DDD流程的第二步,在模型的建立阶段,领域专家与技术人员通过领域建模来完成更为细致的模型建立讨论 领域建模的目的 领域建模主要有两个目的: 将知识可视化,准确、深刻地反映领域知识,并且在业务和技术人…

神经网络——非线性激活

1 非线性激活 1.1 几种常见的非线性激活: ReLU (Rectified Linear Unit)线性整流函数 Sigmoid 1.2代码实战: 1.2.1 ReLU import torch from torch import nn from torch.nn import ReLUinputtorch.tensor([[1,-0.5],[-1,3]])inputtorch.reshape(…

HT97226 160mW免输出耦合电容的立体声耳机放大器

特点: 输出无需隔直流电容 卓越的低音效果 无咔嗒/噼噗声,50uV (typical) Vos 低THDN:最低0.002% 低噪声,VN: 8.5uV 支持单端输入和全差分输入 2.5V至6V较宽的电源工作范围 输出功率:80mW(fIN1kHz,VDD3.6V,RL32Ω, THDN1%) 160mW(PVDD5V,fIN1kHz,RL32Ω…

Java中的抽象类 abstract

抽象方法: 将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容不一样,所以,在父类中不能确定具体的方法体。该方法就可以定义为抽象方法。 抽象类 如果一个类中存在抽象方法,那么该类就必须声…

【软件测试】软件测试-----概念篇

软件测试相关概念 一.需求的相关概念1.1 用户需求1.2 软件需求 二. 开发模型2.1 模型的基本概念.2.2 软件的生命周期2.2.1 理解软件生命周期每个阶段的具体任务 2.3 常见的开发模型.2.3.1 瀑布模型(适用场景:需求固定的小项目).2.3.2 螺旋模型(适用场景:…