当前位置: 首页 > news >正文

详解Qt 之QPainterPath

文章目录

  • 前言
    • QPainterPath 与 QPainter 的区别
    • QPainterPath 的主要函数和成员
      • 成员函数
        • 构造函数和析构函数
        • 路径操作
        • 布尔运算
        • 几何计算
    • 示例代码
      • 示例 1:绘制简单路径
      • 示例 2:使用布尔运算合并路径
      • 示例 3:计算路径长度和角度
    • 更多用法...
  • 总结


前言

QPainterPath 是 Qt 中用于绘制复杂形状的类。它提供了一种矢量图形的表示方式,允许用户绘制直线、曲线、矩形、圆形等图形,并进行布尔运算(如联合、相交、差集等)。与 QPainter 配合使用时,QPainterPath 可以显著简化绘图操作,并提高绘图的灵活性和可维护性。本文将详细介绍 QPainterPath 的功能、常用方法,并通过示例代码展示其实际应用。


QPainterPath 与 QPainter 的区别

QPainter 是 Qt 的基本绘图类,用于在设备上进行绘图操作,如绘制线条、矩形、文本和图像等。QPainter 直接在目标设备(如窗口、小部件或图像)上进行绘图操作。

QPainterPath 则是一个路径类,用于定义复杂的路径。这些路径可以包含多种图形元素,如直线、曲线、矩形和椭圆等。QPainterPath 主要用来描述图形,而 QPainter 用来绘制这些描述的图形。使用 QPainterPath 可以先定义图形路径,然后通过 QPainter 将其绘制到目标设备上。

在使用QPainterPath把路径画完之后,我们需要使用QPainter的drawPath把路径画上去才行

QPainterPath 的主要函数和成员

成员函数

构造函数和析构函数
  • QPainterPath()

    作用:构造一个空的路径对象。

    参数:无。

    返回值:无。

  • QPainterPath(const QPointF &startPoint)

    作用:构造一个以 startPoint 为起点的路径对象。

    参数

    • startPoint:路径的起点。

    返回值:无。

  • ~QPainterPath()

    作用:析构函数,销毁路径对象。

    参数:无。

    返回值:无。

路径操作
  • void moveTo(const QPointF &point)

    作用:将路径的当前点移动到 point

    参数

    • point:新的当前点。

    返回值:无。

  • void lineTo(const QPointF &point)

    作用:从当前点绘制一条直线到 point

    参数

    • point:直线的终点。

    返回值:无。

  • void arcTo(const QRectF &rect, qreal startAngle, qreal arcLength)

    作用:绘制一个以 rect 为边界的圆弧,从 startAngle 开始,弧长为 arcLength

    参数

    • rect:圆弧的边界矩形。
    • startAngle:起始角度(以度为单位)。
    • arcLength:弧长(以度为单位)。

    返回值:无。

  • void cubicTo(const QPointF &ctrlPt1, const QPointF &ctrlPt2, const QPointF &endPt)

    作用:绘制一个三次贝塞尔曲线,从当前点到 endPt,使用 ctrlPt1ctrlPt2 作为控制点。

    参数

    • ctrlPt1:第一个控制点。
    • ctrlPt2:第二个控制点。
    • endPt:曲线的终点。

    返回值:无。

  • void quadTo(const QPointF &ctrlPt, const QPointF &endPt)

    作用:绘制一个二次贝塞尔曲线,从当前点到 endPt,使用 ctrlPt 作为控制点。

    参数

    • ctrlPt:控制点。
    • endPt:曲线的终点。

    返回值:无。

  • void addRect(const QRectF &rect)

    作用:向路径中添加一个矩形。

    参数

    • rect:矩形区域。

    返回值:无。

  • void addEllipse(const QRectF &rect)

    作用:向路径中添加一个椭圆。

    参数

    • rect:椭圆的边界矩形。

    返回值:无。

  • void addPath(const QPainterPath &path)

    作用:向当前路径中添加另一个路径。

    参数

    • path:要添加的路径。

    返回值:无。

  • void closeSubpath()

    作用:闭合当前子路径。

    参数:无。

    返回值:无。

布尔运算
  • QPainterPath united(const QPainterPath &other) const

    作用:返回当前路径和 other 路径的并集。

    参数

    • other:另一个路径。

    返回值:并集路径。

  • QPainterPath intersected(const QPainterPath &other) const

    作用:返回当前路径和 other 路径的交集。

    参数

    • other:另一个路径。

    返回值:交集路径。

  • QPainterPath subtracted(const QPainterPath &other) const

    作用:返回当前路径和 other 路径的差集。

    参数

    • other:另一个路径。

    返回值:差路径。

几何计算
  • QRectF boundingRect() const

    作用:返回路径的边界矩形。

    参数:无。

    返回值:边界矩形。

  • qreal length() const

    作用:返回路径的长度。

    参数:无。

    返回值:路径长度。

  • QPointF pointAtPercent(qreal t) const

    作用:返回路径中百分比 t 处的点。

    参数

    • t:路径长度的百分比(0 到 1 之间)。

    返回值:路径上的点。

  • qreal angleAtPercent(qreal t) const

    作用:返回路径中百分比 t 处的切线角度。

    参数

    • t:路径长度的百分比(0 到 1 之间)。

    返回值:切线角度。

示例代码

示例 1:绘制简单路径

以下示例展示了如何使用 QPainterPath 绘制一条简单的路径,包括直线和曲线:

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QPainterPath>class PathWidget : public QWidget {
protected:void paintEvent(QPaintEvent *event) override {QPainter painter(this);QPainterPath path;path.moveTo(50, 50);path.lineTo(150, 50);path.cubicTo(200, 0, 250, 100, 300, 50);painter.drawPath(path);}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);PathWidget widget;widget.show();return app.exec();
}

示例 2:使用布尔运算合并路径

以下示例展示了如何使用 QPainterPath 的布尔运算来合并两个路径:

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QPainterPath>class BooleanPathWidget : public QWidget {
protected:void paintEvent(QPaintEvent *event) override {QPainter painter(this);QPainterPath path1;path1.addRect(50, 50, 100, 100);QPainterPath path2;path2.addEllipse(100, 100, 100, 100);QPainterPath unitedPath = path1.united(path2);painter.drawPath(unitedPath);}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);BooleanPathWidget widget;widget.show();return app.exec();
}

示例 3:计算路径长度和角度

以下示例展示了如何计算 QPainterPath 的长度和特定百分比处的角度:

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QPainterPath>
#include <QDebug>class LengthAngleWidget : public QWidget {
protected:void paintEvent(QPaintEvent *event) override {QPainter painter(this);QPainterPath path;path.moveTo(50, 50);path.lineTo(150, 50);path.cubicTo(200, 0, 250, 100, 300, 50);qreal length = path.length();qreal angle = path.angleAtPercent(0.5);qDebug() << "Pathlength:" << length;qDebug() << "Angle at 50%:" << angle;painter.drawPath(path);}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);LengthAngleWidget widget;widget.show();return app.exec();
}

更多用法…

在这里插入图片描述


总结

QPainterPath 提供了一种强大且灵活的方式来定义和操作路径。通过与 QPainter 配合使用,可以轻松绘制复杂的图形和进行几何运算。QPainterPath 支持多种图形元素和布尔运算,使其成为绘制和处理矢量图形的理想选择。通过本文的介绍和示例代码,读者可以更好地理解 QPainterPath 的使用方法及其在实际应用中的强大功能。

相关文章:

详解Qt 之QPainterPath

文章目录 前言QPainterPath 与 QPainter 的区别QPainterPath 的主要函数和成员成员函数构造函数和析构函数路径操作布尔运算几何计算 示例代码示例 1&#xff1a;绘制简单路径示例 2&#xff1a;使用布尔运算合并路径示例 3&#xff1a;计算路径长度和角度 更多用法... 总结 前…...

深入理解Apache Kylin:从概念到实践

深入理解Apache Kylin&#xff1a;从概念到实践 引言 Apache Kylin 是一个分布式分析引擎&#xff0c;专为在大规模数据集上进行快速多维分析&#xff08;OLAP&#xff09;设计。自2015年开源以来&#xff0c;Kylin 已经成为许多企业在大数据分析领域的首选工具。本文将从概念…...

vue3框架Arco Design输入邮箱选择后缀

使用&#xff1a; <a-form-item field"apply_user_email" label"邮箱&#xff1a;" ><email v-model"apply_user_email" class"inputborder topinputw"></email> </a-form-item>import email from /componen…...

制作镜像

1.镜像 image&#xff1a; 是一个文件&#xff0c;包含了微型操作系统、核心代码&#xff08;可执行程序&#xff09;、依赖环境&#xff08;库&#xff09; 2.仓库 repository&#xff1a; 存放镜像文件的地方 3.容器&#xff1a; container &#xff1a;是运行镜像的地方--…...

Kylin系列(二)进阶

Kylin系列(二)进阶 目录 简介Kylin架构深入解析 Kylin架构概述核心组件 高级Cube设计 Cube设计原则Cube优化策略 实时数据分析 实时数据处理流程实时Cube构建 高级查询与优化 查询优化技术SQL优化 Kylin与BI工具集成 Tableau集成Power BI集成 监控与调优 系统监控性能调优 常…...

Maven实战.依赖(依赖范围、传递性依赖、依赖调解、可选依赖等)

文章目录 依赖的配置依赖范围传递性依赖传递性依赖和依赖范围依赖调解可选依赖最佳实践排除依赖归类依赖优化依赖 依赖的配置 依赖会有基本的groupId、artifactld 和 version等元素组成。其实一个依赖声明可以包含如下的一些元素&#xff1a; <project> ...<depende…...

关于React17的setState

不可变值 state必须在构造函数中定义 在setState之前不能修改state的值&#xff0c;不要直接修改state,使用不可变值 可能是异步更新 直接使用时异步的 this.setState({count: this.state.count 1 }, () > {console.log(count by callback, this.state.count) // 回调函…...

2024华为OD机试真题-英文输入法Python-C卷D卷-100分

2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 题目描述 主管期望你来实现英文输入法单词联想功能,需求如下: 依据用户输入的单词前缀,从已输入的英文语句中联想出用户想输入的单词。 按字典序输出联想到的单词序列,如果联想不到,请输出用户输入的单词前缀。 注意 英…...

magento2 安装win环境和linux环境

win10 安装 安装前提&#xff0c;php,mysql,apach 或nginx 提前安装好 并且要php配置文件里&#xff0c;php.ini 把错误打开 display_errorsOn开始安装 检查环境 填写数据库信息 和ssl信息&#xff0c;如果ssl信息没有&#xff0c;则可以忽略 填写域名和后台地址&#xff0…...

【城市数据集】世界城市数据库和访问门户工具WUDAPT

世界城市数据库和访问门户工具WUDAPT WUDAPTLCZ分类具体步骤参考 在 城市气候研究中&#xff0c;用于描述城市特征的数据集一般采用基于类别的传统方法&#xff0c;将城市地区分为数量有限的类型&#xff0c;从而导致精确度下降。越来越多的新数据集以亚米微尺分辨率描述城市的…...

网络爬虫必备工具:代理IP科普指南

文章目录 1. 网络爬虫简介1.1 什么是网络爬虫&#xff1f;1.2 网络爬虫的应用领域1.3 网络爬虫面临的主要挑战 2. 代理IP&#xff1a;爬虫的得力助手2.1 代理IP的定义和工作原理2.2 爬虫使用代理IP的必要性 3. 代理IP的类型及其在爬虫中的应用3.1 动态住宅代理3.2 动态数据中心…...

JMeter接口测试-5.JMeter高级使用

JMeter高级使用 案例&#xff1a; 用户登录后-选择商品-添加购物车-创建订单-验证结果 问题&#xff1a; JMeter测试中&#xff0c;验证结果使用断言&#xff0c;但断言都是固定的内容假如要判断的内容(预期内容)是在变化的, 有时候还是不确定的, 那该怎么办呢? 解决&…...

网络安全大模型开源项目有哪些?

01 Ret2GPT 它是面向CTF二进制安全的工具&#xff0c;结合ChatGPT API、Retdec和Langchain进行漏洞挖掘&#xff0c;它能通过问答或预设Prompt对二进制文件进行分析。 https://github.com/DDizzzy79/Ret2GPT 02 OpenAI Codex 它是基于GPT-3.5-turbo模型&#xff0c;用于编写…...

【赠书第18期】人工智能B2B落地实战:基于云和Python的商用解决方案

文章目录 前言 1 方案概述 2 方案实施 2.1 云平台选择 2.2 Python环境搭建 2.3 应用开发与部署 2.4 应用管理 2.5 安全性与隐私保护 3 方案优势与效益 4 推荐图书 5 粉丝福利 前言 随着云计算技术的快速发展&#xff0c;越来越多的企业开始将业务迁移至云端&#x…...

《昇思25天学习打卡营第24天》

接续上一天的学习任务&#xff0c;我们要继续进行下一步的操作 构造网络 当处理完数据后&#xff0c;就可以来进行网络的搭建了。按照DCGAN论文中的描述&#xff0c;所有模型权重均应从mean为0&#xff0c;sigma为0.02的正态分布中随机初始化。 接下来了解一下其他内容 生成…...

KeePass密码管理工具部署

KeePass密码管理工具部署 安装包下载入口 双击执行&#xff0c;根据提示完成安装&#xff1a; 安装完成后如图&#xff1a;...

C#中导出dataGridView数据为Excel

C#中导出dataGridView数据为Excel #region 导出Excel功能函数 /// <summary> /// dataGridView 导出Excel功能函数 /// </summary> /// <param name"dataView">dataGridView数据表</param> /// <param name"filePath">路径…...

算法学习6——贪心算法

什么是贪心算法&#xff1f; 贪心算法是一种在每一步选择中都采取当前状态下最优或最有利的选择的算法。其核心思想是通过一系列局部最优选择来达到全局最优解。贪心算法广泛应用于各种优化问题&#xff0c;如最短路径、最小生成树、背包问题等。 贪心算法的特点 局部最优选…...

【C++】标准库:介绍string类

string 一.string类介绍二.string类的静态成员变量三.string类的常用接口1.构造函数&#xff08;constructor&#xff09;2.析构函数&#xff08;destructor&#xff09;3.运算符重载&#xff08;operator&#xff09;1.operator2.operator[]3.operator4.operator 4.string的四…...

未来不会使用 AI 的人真的会被淘汰吗?

AI 是今年大火的一个话题&#xff0c;随着 ChatGPT 之类的一系列大模型开始流行以后&#xff0c;有不少的培训机构宣称这样的口号: “未来不会使用 AI 的人将会被淘汰”。我觉得这个观点本身并没有错&#xff0c;但是关键在于那些培训机构出于自身的利益&#xff0c;故意忽略了…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

Visual Studio Code 扩展

Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后&#xff0c;命令 changeCase.commands 可预览转换效果 EmmyLua…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究

摘要&#xff1a;在消费市场竞争日益激烈的当下&#xff0c;传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序&#xff0c;探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式&#xff0c;分析沉浸式体验的优势与价值…...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...