Qt:玩转QPainter序列五

2024-08-27 15:12
文章标签 qt 玩转 序列 qpainter

本文主要是介绍Qt:玩转QPainter序列五,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

开启序列五

正文

继续先看源码,下面是解释
在这里插入图片描述
首先看这两个#if #endif中的内容

1. 矩阵(Matrix)相关方法

过时的方法(Qt 5.13 之前使用)
  • void setMatrix(const QMatrix &matrix, bool combine = false);

    • 设置绘图矩阵。combine 参数指定是否将新矩阵与现有矩阵组合(默认为 false,即替换现有矩阵)。
  • const QMatrix &matrix() const;

    • 返回当前的绘图矩阵。
  • const QMatrix &deviceMatrix() const;

    • 返回当前设备的矩阵。
  • void resetMatrix();

    • 重置绘图矩阵为单位矩阵。

这些方法在 Qt 5.13 之后被标记为过时,推荐使用QT_DEPRECATED_X("Use xxx instead")中的xxx函数来替代。

既然它们都已经被替代了,我们也就不看了,直接看这些新方法。

推荐使用的方法(Qt 5.13 及之后)
  • void setTransform(const QTransform &transform, bool combine = false);

    • 设置绘图变换。combine 参数指定是否将新变换与现有变换组合(默认为 false,即替换现有变换)。
  • const QTransform &transform() const;

    • 返回当前的绘图变换。
  • const QTransform &deviceTransform() const;

    • 返回当前设备的变换。
  • void resetTransform();

    • 重置绘图变换为单位变换。即恢复到没有变换的状态
  • void setWorldTransform(const QTransform &transform, bool combine = false);

    • 设置世界变换。combine 参数指定是否将新变换与现有变换组合(默认为 false,即替换现有变换)。
  • const QTransform &worldTransform() const;

    • 返回当前的世界变换。
  • QTransform combinedTransform() const;

    • 返回当前变换和世界变换的组合结果。
  • void setWorldMatrixEnabled(bool enabled);

    • 启用或禁用世界变换。
  • bool worldMatrixEnabled() const;

    • 返回是否启用了世界变换。

2. 变换(Transformations)

  • void scale(qreal sx, qreal sy);

    • 按指定的比例因子 sxsy 缩放绘制内容。相当于绘制的图形的各点的(x,y),变成(x * sx,y * sy)
  • void shear(qreal sh, qreal sv);

    • 按指定的剪切因子 shsv 剪切绘制内容。使其在某个方向上“倾斜”或“拉伸”,而不是简单地缩放或旋转。
  • void rotate(qreal a);

    • 按指定的角度 a 旋转绘制内容。大于0逆时针,小于0顺时针
  • void translate(const QPointF &offset);

    • 按指定的 QPointF 偏移量 offset 平移绘制内容。
  • inline void translate(const QPoint &offset);

    • 按指定的 QPoint 偏移量 offset 平移绘制内容。
  • inline void translate(qreal dx, qreal dy);

    • 按指定的 dxdy 偏移量平移绘制内容。相当于绘制的图形的各点的(x,y),变成(x + dx,y + dy)

四种变换

1. 绘图变换(Painter Transform)

定义: 绘图变换是应用于 QPainter 的变换,它影响所有通过 QPainter 绘制的内容。绘图变换通常包括平移、缩放、旋转和剪切操作。

用途:

  • 局部变换:例如,在一个小区域内缩放或旋转图形。
  • 局部调整:改变图形的大小、位置或角度。

示例:

QPainter painter;
QTransform transform;
transform.translate(50, 50); // 平移 50 像素
painter.setTransform(transform); // 应用变换
painter.drawRect(10, 10, 100, 100); // 绘制图形
2. 设备变换(Device Transform)

定义: 设备变换指的是与绘图设备(如窗口、图片等)相关的变换。这种变换通常是由绘图设备本身的属性或设置决定的,例如 DPI(每英寸点数)或其他设备特定的设置。

用途:

  • 设备适配:处理不同设备的显示特性,使图形在各种设备上显示一致。
  • 设备属性:确保绘图内容适应设备的实际显示特性。

示例:

QPainter painter;
QTransform deviceTransform = painter.deviceTransform(); // 获取设备变换
3. 单位变换(Identity Transform)

定义: 单位变换是指没有任何变换效果的变换,即绘图内容以其原始状态显示。这种变换也称为
单位矩阵变换,代表不进行任何变换。

用途:

  • 重置变换:当需要返回到没有变换的状态时使用。
  • 基本状态:用于清楚的绘图基线,以确保没有变换影响绘制结果。

示例:

QPainter painter;
painter.resetTransform(); // 重置变换为单位变换
painter.drawRect(10, 10, 100, 100); // 绘制图形
4. 世界变换(World Transform)

定义: 世界变换是应用于整个绘图场景的变换。它影响 QPainter 绘制的所有内容,与绘图变换类似,但通常用于设置更大的绘图范围的变换。它影响整个绘图设备的全局坐标系。

用途:

  • 全局变换:应用于整个场景,而不仅仅是单个绘图操作。
  • 全局调整:实现全局的旋转、缩放或其他变换效果。

示例:

QPainter painter;
QTransform worldTransform;
worldTransform.rotate(45); // 旋转 45 度
painter.setWorldTransform(worldTransform); // 设置世界变换
painter.drawEllipse(10, 10, 100, 100); // 绘制图形

关于Transform类

这个类就是一个矩阵类,用于表示二位空间中的线性变换。学过线代的应该都知道矩阵是啥了,如果忘记了,可以看完我以前的一篇博客线性代数之矩阵

示例一:

"变换"用于在图形绘制中改变绘制内容的位置、方向和大小。它们是图形变换操作的基础

void PaintWidget::paintEvent(QPaintEvent* event)
{Q_UNUSED(event);QPainter painter(this);QPen pen;QTransform transform;// 右平移 100 像素transform.translate(100, 0);pen.setColor(Qt::green);painter.setPen(pen);// 设置变换,替换现有变换painter.setTransform(transform);// 绘制一个矩形painter.drawRect(200, 50, 100, 100);// 左边平移 100 像素pen.setColor(Qt::red);painter.setPen(pen);transform.translate(-200,-10);painter.setTransform(transform);painter.drawRect(200, 50, 100, 100);//translate,x正右,负左;y正下,负上}

在这里插入图片描述

示例二:

void PaintWidget::paintEvent(QPaintEvent* event)
{Q_UNUSED(event);QPainter painter(this);QPen pen;pen.setColor(Qt::red);painter.setPen(pen);QTransform transform;//向右,向下皆平移50像素transform.translate(50,50);//旋转45°transform.rotate(45);//应用变换painter.setTransform(transform);//画个矩形painter.drawRect(10,10,80,80);//获取当前变换QTransform currentTransform = painter.transform();QTransform transform2;//整个图形缩小一倍transform2.scale(0.5,0.5);// 组合变换QTransform combinedTransform = transform2 * currentTransform;// 应用组合后的变换painter.setTransform(combinedTransform);//画个矩形painter.drawRect(10,10,80,80);// 水平剪切painter.shear(0.5,0);painter.drawRect(300, 100, 100, 100);// 重置变换painter.resetTransform();painter.drawRect(10,10,80,80);}

在这里插入图片描述

这篇关于Qt:玩转QPainter序列五的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1112024

相关文章

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要