当前位置: 首页 > news >正文

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()函数一次操作矩形的坐标和尺寸。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Desktop docker 部署 WordPress
  • 智慧矿山:EasyCVR助力矿井视频多业务融合及视频转发服务建设
  • BDD 100K dataset 的标签数据结构(json文件)
  • ABAP中CONVERT_TO_LOCAL_CURRENCY 函数的使用方法
  • 安装elasticsearch
  • 动态黑窗口打印文字404页面源码
  • ELK优化之Elasticsearch
  • 如何摆脱反爬虫机制?
  • 【QT】常用控件|widget|QPushButton|RadioButton|核心属性
  • 笔记14:程序中的循环结构
  • vue process.env.VUE_APP_BASE_API的相关配置及axios简单封装
  • gcc: 自身编译: opt;有个变量怎么找不到?
  • Mojolicious测试驱动开发:单元与集成测试的艺术
  • Rust简明教程第八章-TDD、闭包、迭代器工作空间
  • 常用SHELL命令
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 0基础学习移动端适配
  • Android开源项目规范总结
  • co.js - 让异步代码同步化
  • ES6系列(二)变量的解构赋值
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • JS函数式编程 数组部分风格 ES6版
  • Linux CTF 逆向入门
  • node 版本过低
  • React Native移动开发实战-3-实现页面间的数据传递
  • Spring框架之我见(三)——IOC、AOP
  • 阿里云Kubernetes容器服务上体验Knative
  • 判断客户端类型,Android,iOS,PC
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 使用docker-compose进行多节点部署
  • 通信类
  • 推荐一个React的管理后台框架
  • 容器镜像
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • ###C语言程序设计-----C语言学习(6)#
  • #pragma预处理命令
  • #微信小程序:微信小程序常见的配置传值
  • (1)STL算法之遍历容器
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (算法)硬币问题
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)http协议
  • (转载)跟我一起学习VIM - The Life Changing Editor