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

相关文章

基于Qt Qml实现时间轴组件

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

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

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

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节

Qt实现文件的压缩和解压缩操作

《Qt实现文件的压缩和解压缩操作》这篇文章主要为大家详细介绍了如何使用Qt库中的QZipReader和QZipWriter实现文件的压缩和解压缩功能,文中的示例代码简洁易懂,需要的可以参考一下... 目录一、实现方式二、具体步骤1、在.pro文件中添加模块gui-private2、通过QObject方式创建

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

uva 10131 最长子序列

题意: 给大象的体重和智商,求体重按从大到小,智商从高到低的最长子序列,并输出路径。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vect

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ