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开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 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

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击,设定蓝色的终点。右键双击设定终点,用蓝色标记。 设置障碍点: 鼠标左键或者右键按着不放,拖动可以设置黑色的障碍点。按住左键或右键并拖动,设置一系列黑色障碍点

使用Qt编程QtNetwork无法使用

使用 VS 构建 Qt 项目时 QtNetwork 无法使用的问题 - 摘叶飞镖 - 博客园 (cnblogs.com) 另外,强烈建议在使用QNetworkAccessManager之前看看这篇文章: Qt 之 QNetworkAccessManager踏坑记录-CSDN博客 C++ Qt开发:QNetworkAccessManager网络接口组件 阅读目录 1.1 通用API函数

秒变高手:玩转CentOS 7软件更换的方法大全

在 CentOS 7 中更换软件源可以通过以下步骤完成。更换源可以加快软件包的下载速度,特别是当默认源速度较慢时。以下是详细步骤: 前言 为了帮助您解决在使用CentOS 7安装不了软件速度慢的问题,我们推出了这份由浪浪云赞助的教程——“CentOS7如何更换软件源加快下载速度”。 浪浪云,以他们卓越的弹性计算、云存储和网络服务受到广泛好评,他们的支持和帮助使得我们可以将最前沿的技术知识分

Qt多语种开发教程

Qt作为跨平台的开发工具,早已应用到各行各业的软件开发中。 今天讲讲,Qt开发的正序怎么做多语言开发。就是说,你设置中文,就中文显示;设置英语就英文显示,设置繁体就繁体显示,设置发育就显示法语等。 开发环境(其实多语种这块根环境没太大关系):win10,Qt.5.12.10 一.先用QtCreator创建一个简单的桌面程序 1.工程就随便命名“LanguageTest”,其他默认。 2.在设计师

day-50 求出最长好子序列 I

思路 二维dp,dp[i][h]表示nums[i] 结尾,且有不超过 h 个下标满足条件的最长好子序列的长度(0<=h<=k),二维数组dp初始值全为1 解题过程 状态转换方程: 1.nums[i]==nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h]+1) 2.nums[i]!=nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h-1