「QT」几何数据类 之 QSizeF 浮点型尺寸类

✨博客主页
何曾参静谧的博客
「QT」QT5程序设计
「VS」Visual Studio 「C/C++」C/C++程序设计 「UG/NX」BlockUI集合
「Win」Windows程序设计 「DSA」数据结构与算法 「UG/NX」NX二次开发
「QT」QT5程序设计 「File」数据文件格式 「PK」Parasolid函数说明
「Py」Python程序设计 「Math」探秘数学世界

目录

Qt中QSizeF类详解(基于Qt 5.15版本)

一、类的引言

QSizeF类是Qt框架中用于表示二维对象浮点大小的重要类。与QSize类不同,QSizeF使用浮点数(通常是qreal类型,在Qt中通常定义为double)来表示宽度和高度,从而提供了更高的精度。这在处理需要高精度的图形操作时尤为重要,如精确绘制、缩放和布局管理等。
官方文档:https://doc.qt.io/qt-5/qsizef.html

二、使用范围

QSizeF类主要用于以下场景:

  • 在需要高精度尺寸计算的图形绘制中。
  • 在处理缩放、旋转等图形变换时。
  • 在布局管理器中指定控件的浮点大小。
  • 在进行尺寸比较、缩放、交换等操作时,需要更高的精度。

三、类的头文件

在Qt 5.15版本中,QSizeF类的头文件是<QSizeF>,通常通过包含<QtCore/QSizeF>来引用。在使用QSizeF类之前,需要确保在项目的.pro文件中添加了QT += core配置,以包含QtCore模块。

四、类的继承

与QSize类一样,QSizeF类也是一个独立的类,不继承自其他类。它实现了对二维对象浮点大小的表示和操作功能,是Qt几何数据类体系中的一个重要组成部分。

五、类的构造介绍

QSizeF类提供了两个构造函数:

  1. QSizeF():构造一个默认的QSizeF对象,其宽度和高度均被设置为0.0。
  2. QSizeF(qreal width, qreal height):构造一个宽度为width、高度为height的QSizeF对象。
    何曾参静谧的博客

六、共有函数介绍

QSizeF类提供了以下共有成员函数:

  • qreal width() const:返回QSizeF对象的宽度。
  • qreal height() const:返回QSizeF对象的高度。
  • void setWidth(qreal width):设置QSizeF对象的宽度。
  • void setHeight(qreal height):设置QSizeF对象的高度。
  • bool isEmpty() const:如果宽度和高度中的任何一个小于或等于0.0(考虑到浮点数精度问题,通常不会严格等于0.0,而是接近0.0的一个极小值),则返回true;否则返回false。但请注意,由于浮点数的特性,判断一个浮点数是否等于0.0通常是不安全的,因此isEmpty()的实际用途可能有限。
  • bool isValid() const:如果宽度和高度都是有效的(即大于0.0,考虑到浮点数精度,这里通常意味着不是负数或极小的值),则返回true;否则返回false
  • QSizeF boundedTo(const QSizeF &other) const:返回一个包含此尺寸和给定other尺寸的最小宽度和高度的尺寸。
  • QSizeF expandedTo(const QSizeF &other) const:返回一个包含此尺寸和给定other尺寸的最大宽度和高度的尺寸。
  • QSizeF scaled(qreal w, qreal h, Qt::AspectRatioMode mode) const:根据指定的模式mode,将大小缩放为具有给定宽度w和高度h的矩形。
  • QSizeF scaled(const QSizeF &s, Qt::AspectRatioMode mode) const:与上一个函数类似,但使用另一个QSizeF对象s作为缩放目标。
  • void transpose():交换宽度和高度值。注意,这个函数会修改当前对象。
  • QSizeF transposed() const:返回交换宽度和高度后的新QSizeF对象,不改变当前对象。

七、static函数介绍

在Qt 5.15版本中,QSizeF类没有提供static成员函数。但Qt框架中的其他类可能会提供与QSizeF相关的static函数,用于执行特定的几何计算或转换。

八、运算符重载

QSizeF类支持以下运算符重载,使得尺寸的操作更加直观和方便:

  • QSizeF &operator+=(const QSizeF &s):将当前QSizeF对象与另一个QSizeF对象s相加,结果存储在当前对象中。
  • QSizeF &operator-=(const QSizeF &s):将当前QSizeF对象与另一个QSizeF对象s相减,结果存储在当前对象中。
  • QSizeF &operator*=(qreal c):将当前QSizeF对象乘以一个浮点数c,结果存储在当前对象中。
  • QSizeF &operator/=(qreal c):将当前QSizeF对象除以一个浮点数c,结果存储在当前对象中。
  • bool operator==(const QSizeF &s1, const QSizeF &s2):比较两个QSizeF对象是否相等,考虑到浮点数精度问题,通常会有一个极小的误差范围。
  • bool operator!=(const QSizeF &s1, const QSizeF &s2):比较两个QSizeF对象是否不相等。

此外,QSizeF类还支持与QPointF类相似的操作符重载,如+-*/等,用于执行尺寸与点的加减、缩放等操作。但请注意,这些操作的结果通常是另一个QSizeF或QPointF对象,而不是直接修改当前对象(除非使用了*=/=等赋值运算符)。
何曾参静谧的博客

九、详细代码举例

以下是一个使用QSizeF类的详细代码示例:

cpp 复制代码
#include <QCoreApplication>
#include <QSizeF>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 构造一个QSizeF对象
    QSizeF size1(100.5, 200.75);
    qDebug() << "Size1: width=" << size1.width() << ", height=" << size1.height();

    // 设置新的宽度和高度
    size1.setWidth(150.25);
    size1.setHeight(300.5);
    qDebug() << "Updated Size1: width=" << size1.width() << ", height=" << size1.height();

    // 构造另一个QSizeF对象
    QSizeF size2(250.0, 150.75);

    // 使用boundedTo函数获取最小尺寸
    QSizeF minSize = size1.boundedTo(size2);
    qDebug() << "Bounded Size: width=" << minSize.width() << ", height=" << minSize.height();

    // 使用expandedTo函数获取最大尺寸
    QSizeF maxSize = size1.expandedTo(size2);
    qDebug() << "Expanded Size: width=" << maxSize.width() << ", height=" << maxSize.height();

    // 使用scaled函数进行缩放,保持宽高比
    QSizeF scaledSize = size1.scaled(50.0, 50.0, Qt::KeepAspectRatio);
    qDebug() << "Scaled Size: width=" << scaledSize.width() << ", height=" << scaledSize.height();

    // 交换宽度和高度
    QSizeF transposedSize = size1.transposed();
    qDebug() << "Transposed Size: width=" << transposedSize.width() << ", height=" << transposedSize.height();

    // 直接修改对象(使用赋值运算符)
    size1 *= 0.5; // 缩放为原来的一半
    qDebug() << "Halved Size1: width=" << size1.width() << ", height=" << size1.height();

    return a.exec();
}

在这个示例中,我们创建了两个QSizeF对象size1size2,并使用了width()height()setWidth()setHeight()boundedTo()expandedTo()scaled()transposed()等成员函数来操作它们。此外,我们还展示了如何使用赋值运算符*=来直接修改对象。最后,我们使用qDebug()函数输出了各个尺寸的值。
何曾参静谧的博客


相关推荐
Scott9999HH13 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社14 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海14 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖15 小时前
JDK 26 新特性详解
java·开发语言
马优晨16 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区17 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大18 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai18 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜18 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa18 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio