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

相关文章

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

QT Creator配置Kit的实现示例

《QTCreator配置Kit的实现示例》本文主要介绍了使用Qt5.12.12与VS2022时,因MSVC编译器版本不匹配及WindowsSDK缺失导致配置错误的问题解决,感兴趣的可以了解一下... 目录0、背景:qt5.12.12+vs2022一、症状:二、原因:(可以跳过,直奔后面的解决方法)三、解决方

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro