Qt扫盲-QRect矩形描述类

QRect矩形描述总结

  • 一、概述
  • 二、常用函数
    • 1. 移动类
    • 2. 属性函数
    • 3. 判断
    • 4. 比较计算
  • 三、渲染
  • 三、坐标

一、概述

QRect类使用整数精度在平面中定义一个矩形。在绘图的时候经常使用,作为一个二维的参数描述类。

一个矩形主要有两个重要属性,一个是坐标(x,y),一个是尺寸(长宽)。所以QRect的构造函数也是这样描述的。
QRect可以用一组左、顶、宽、高整数来构造,也可以用QPoint和QSize来构造。下面的代码创建了两个相同的矩形。

QRect r1(100, 200, 11, 16);
QRect r2(QPoint(100, 200), QSize(11, 16));

还有第三个构造函数,它使用左上角和右下角的坐标创建QRect,但我们建议我们避免使用它。其基本原理是由于历史原因,bottom()和right()函数返回的值偏离了矩形的真正右下角。

二、常用函数

QRect类提供了一组函数,这些函数返回各种矩形坐标,并支持对这些坐标的操作。

1. 移动类

QRect还提供了相对于各种坐标移动矩形的函数,以move开头的函数都不会修改矩形的大小,只是改坐标值。

移动的要点在于移动的Rect的方向,看名称就知道,移动会有矩形的四个角点,还会有X,Y方向。

  • moveBottom(int y)
  • moveBottomLeft(const QPoint &position)
  • moveBottomRight(const QPoint &position)
  • moveCenter(const QPoint &position)
  • moveLeft(int x)
  • moveRight(int x)
  • moveTo(int x, int y)
  • moveTo(const QPoint &position)
  • moveTop(int y)
  • moveTopLeft(const QPoint &position)
  • moveTopRight(const QPoint &position)

translate()函数将矩形相对于当前位置移动给定的偏移量,translate()函数返回该矩形的转换副本,这个参数是移动多少量,而move系列函数是移动到坐标。

2. 属性函数

size() 函数的作用是:以QSize的形式返回矩形的维度。还可以使用width()和height()函数分别检索尺寸。要操作尺寸,可以使用setSize()、setWidth()或setHeight()函数。也可以通过应用设置矩形坐标的函数之一来更改大小,例如setBottom()或setRight()。

相应的还有很多获取矩形的坐标点,尺寸等属性等函数。就像下面一样,矩形的坐标点有topLeft、BottomRight等信息。
在这里插入图片描述

3. 判断

  • contains() :告诉给定的点是否在矩形内,
  • intersects():判断这个矩形与给定的矩形相交,

在图形处理中,QRect类还提供了intersected()函数,该函数返回交点矩形,以及united()函数,该函数返回包含给定矩形和以下内容的矩形,有时候求面积的话就可以不用再自己写了。下面是两个函数的差别示意图:
在这里插入图片描述

如果left() > right()或top() > bottom(),则isEmpty()函数返回true。请注意,空矩形是无效的:isValid()函数如果left() <= right()且top() <= bottom()则返回true。另一方面,空矩形(isNull() == true)的宽度和高度都设置为0。

还有一个比较常用的函数是转置函数

QRect r = {15, 51, 42, 24};
r = r.transposed(); // r == {15, 51, 24, 42}

由于QRect和QRectF的定义方式,空QRect的定义方式基本上与QRectF相同。

4. 比较计算

这个也可以用 + 、- 、!= 等运算符。QRect对象可以流式化,也就是可以用QDataStream去序列化数据。

bool operator!=(const QRect &r1, const QRect &r2)
QRect operator+(const QRect &rectangle, const QMargins &margins)
QRect operator+(const QMargins &margins, const QRect &rectangle)
QRect operator-(const QRect &lhs, const QMargins &rhs)
QDataStream &operator<<(QDataStream &stream, const QRect &rectangle)
bool operator==(const QRect &r1, const QRect &r2)
QDataStream &operator>>(QDataStream &stream, QRect &rectangle)

三、渲染

当使用抗混叠绘制器时,QRect的边界线将在数学矩形边界线的两侧对称地渲染。但是当使用别名绘制器(默认)时,其他规则适用。然后,当使用一个像素宽的笔渲染时,QRect的边界线将渲染到数学矩形边界线的右侧和下方。

当使用两个像素宽的笔渲染时,边界线将被数学矩形从中间分割。当笔被设置为偶数像素时,就会出现这种情况,当使用带有奇数像素的笔进行渲染时,多余的像素将被渲染到数学矩形的右侧和下方,就像在一个像素的情况下一样。
在这里插入图片描述

三、坐标

QRect类提供了一组函数,这些函数返回各种矩形坐标,并支持对这些坐标的操作。QRect还提供了相对于各种坐标移动矩形的函数。
例如,left(), setLeft()和movelleft()函数作为示例:left()返回矩形左边缘的x坐标,setLeft()将矩形的左边缘设置为给定的x坐标(它可以改变宽度,但永远不会改变矩形的右边缘),movelleft()将整个矩形水平移动,使矩形的左边缘保持给定的x坐标,其大小不变。
在这里插入图片描述
请注意,由于历史原因,bottom()和right()函数返回的值偏离了矩形的真正右下角:right()函数返回left() + width() - 1, bottom()函数返回top() + height() - 1。对于方便函数bottomRight()返回的点也是如此。此外,topRight()和bottomLeft()函数的x和y坐标分别包含与真正的右边缘和底边缘相同的偏差。

Qt建议我们使用x() + width()和y() + height()来找到真正的右下角,并避免使用right()和bottom()。

另一个解决方案是使用QRectF: QRectF类在平面中使用浮点精度的坐标定义一个矩形,QRectF::right()和QRectF::bottom()函数确实返回右坐标和底坐标。

还可以使用adjust()函数向这个矩形的坐标添加偏移量,也可以使用adjusted()函数基于对原始矩形的调整来检索一个新的矩形。如果宽度和高度中的任何一个为负,则使用 normalized() 函数来检索角被交换的矩形。

  • normalized()
    返回一个规范化矩形;也就是说,一个具有非负宽度和高度的矩形。
    如果width() < 0,函数将交换左右角,如果height() < 0,函数将交换上下角。

此外,QRect还提供了getcoord()函数,该函数提取矩形的左上角和右下角的位置,以及getRect()函数,该函数提取矩形的左上角、宽度和高度。使用setcoord()和setRect()函数一次操作矩形的坐标和尺寸。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/776655.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端面试题16(跨域问题)

跨域问题源于浏览器的同源策略&#xff08;Same-origin policy&#xff09;&#xff0c;这一策略限制了来自不同源的“写”操作&#xff08;比如更新、删除数据等&#xff09;&#xff0c;同时也限制了读操作。当一个网页尝试请求与自身来源不同的资源时&#xff0c;浏览器会阻…

设计模式探索:代理模式

1. 什么是代理模式 定义 代理模式是一种结构型设计模式&#xff0c;通过为其他对象提供一种代理以控制对这个对象的访问。代理对象在客户端和实际对象之间起到中介作用&#xff0c;可以在不改变真实对象的情况下增强或控制对真实对象的访问。 目的 代理模式的主要目的是隐…

着急,为啥AI叫好不叫座啊?

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 李彦宏在2024世界人工智能大会上说&#xff1a; 没有应用&#xff0c;光有基础模型&#xff0c;不管是开源还是闭源都一文不值&#xff0c;所以我从去年下半年开始讲&#xff0c;大家不要卷模型了&#xff0c;要去…

MySQL---事务管理

1.关于事务 理解和学习事务&#xff0c;不能只站在程序猿的角度来理解事务&#xff0c;而是要站在使用者&#xff08;用户&#xff09;的角度来理解事务。 比如支付宝转账&#xff0c;A转了B100块前&#xff0c;在程序猿的角度来看&#xff0c;是两条update操作&#xff0c;A …

PCDN技术如何提高内容分发效率?(贰)

PCDN技术通过以下方式提高内容分发效率: 1.利用用户设备作为分发节点:与传统的 CDN技术主要依赖中心化服务器不同&#xff0c; PCDN技术利用用户的设备作为内容分发的节点。当用户下载内容时&#xff0c;他们的设备也会成为内容分发的一部分&#xff0c;将已下载的内容传递给其…

项目部署_持续集成_Jenkins

1 今日内容介绍 1.1 什么是持续集成 持续集成&#xff08; Continuous integration &#xff0c; 简称 CI &#xff09;指的是&#xff0c;频繁地&#xff08;一天多次&#xff09;将代码集成到主干 持续集成的组成要素 一个自动构建过程&#xff0c; 从检出代码、 编译构建…

树状数组实现 查找逆序对

题意&#xff1a; 输入一个整数n。 接下来输入一行n个整数 。 1< < n ,且每个数字只会出现一次 题解&#xff1a; 按每个数字的大小存入树状数组 #include<bits/stdc.h> using namespace std; #define ll long long const int N10000; int arr[N]; ll a[N];…

Java中关于构造代码块和静态代码块的解析

构造代码块 特点&#xff1a;优先于构造方法执行,每new一次,就会执行一次 public class Person {public Person(){System.out.println("我是无参构造方法");}{System.out.println("我是构造代码块"); //构造代码块} }public class Test {public stati…

golang与以太坊交互

文章目录 golang与以太坊交互什么是go-ethereum与节点交互前的准备使用golang与以太坊区块链交互查询账户的余额使用golang生成以太坊账户使用golang生成以太坊钱包使用golang在账户之间转移eth安装使用solc和abigen生成bin和abi文件生成go文件使用golang在测试网上部署智能合约…

GD32MCU如何实现掉电数据保存?

大家在GD32 MCU应用时&#xff0c;是否会碰到以下应用需求&#xff1a;希望在MCU掉电时保存一定的数据或标志&#xff0c;用以记录一些关键的数据。 以GD32E103为例&#xff0c;数据的存储介质可以选择内部Flash或者备份数据寄存器。 如下图所示&#xff0c;片内Flash具有10年…

【综合能源】计及碳捕集电厂低碳特性及需求响应的综合能源系统多时间尺度调度模型

目录 1 主要内容 2 部分程序 3 实现效果 4 下载链接 1 主要内容 本程序是对《计及碳捕集电厂低碳特性的含风电电力系统源-荷多时间尺度调度方法》方法复现&#xff0c;非完全复现&#xff0c;只做了日前日内部分&#xff0c;并在上述基础上改进升级为电热综合电源微网系统&…

力扣习题--找不同

目录 前言 题目和解析 1、找不同 2、 思路和解析 总结 前言 本系列的所有习题均来自于力扣网站LeetBook - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 题目和解析 1、找不同 给定两个字符串 s 和 t &#xff0c;它们只包含小写字母。 字符串 t…

智能光伏开发都能用到什么软件和工具?

随着全球对可再生能源的日益重视和光伏技术的快速发展&#xff0c;智能光伏开发已成为推动能源转型的重要力量。在光伏项目的全生命周期中&#xff0c;从设计、建设到运营管理&#xff0c;各种软件和工具的应用发挥着至关重要的作用。 一、光伏系统设计软件 1、PVsyst PVsyst…

Python创建MySQL数据库

一、使用Docker部署本地MySQL数据库 docker run --restartalways -p 3307:3306 --name mysql -e MYSOL_ROOT_PASSWORDlms123456 -d mysql:8.0.25 参数解析: 用户名:root 密码:lms123456 端口:3307 二、在Pycharm开发工具中配置连接MySQL数据库 三、安装zdppy_mysql pip inst…

【LabVIEW学习篇 - 2】:LabVIEW的编程特点

文章目录 LabVIEW的编程特点图形编程天然并行运行基于数据流运行 LabVIEW的编程特点 图形编程 LabVIEW使用图形化的图形化编程语言&#xff08;G语言&#xff09;&#xff0c;用户通过在程序框图中拖放和连接各种节点&#xff08;Nodes&#xff09;来编写程序。每个节点代表一…

tobias实现支付宝支付

tobias是一个为支付宝支付SDK做的Flutter插件。 如何使用 你需要在pubspec.yaml中配置url_scheme。url_scheme是一个独特的字符串&#xff0c;用来重新启动你的app&#xff0c;但是请注意字符串“_”是不合法的。 在iOS端&#xff0c;你还需要配置并传入一个universal link。…

动手学深度学习(Pytorch版)代码实践 -循环神经网络-53语言模型和数据集

53语言模型和数据集 1.自然语言统计 引入库和读取数据&#xff1a; import random import torch from d2l import torch as d2l import liliPytorch as lp import numpy as np import matplotlib.pyplot as plttokens lp.tokenize(lp.read_time_machine())一元语法&#xf…

利用Redis bitmap 实现签到案例

数据库实现 设计签到功能对应的数据库表 CREATE TABLE sign_record (id bigint NOT NULL AUTO_INCREMENT COMMENT 主键,user_id bigint NOT NULL COMMENT 用户id,year year NOT NULL COMMENT 签到年份,month tinyint NOT NULL COMMENT 签到月份,date date NOT NULL COMMENT 签…

物联网行业等保有什么要求

中国网络安全等级保护制度&#xff08;简称“等保”&#xff09;对物联网行业有特定的要求&#xff0c;以确保物联网系统的安全性。等保2.0在原有安全通用要求的基础上&#xff0c;增加了针对新技术如云计算、物联网、移动互联网等的扩展要求。以下是一些关键的物联网安全扩展要…

C语言编译和编译预处理

编译预处理 • 编译是指把高级语言编写的源程序翻译成计算机可识别的二进制程序&#xff08;目标程序&#xff09;的过程&#xff0c;它由编译程序完成。 • 编译预处理是指在编译之前所作的处理工作&#xff0c;它由编译预处理程序完成 在对一个源程序进行编译时&#xff0c;…