Qt基础类05-尺寸类QSize

摘要

1.本文测试验证了QT5中的QSize尺寸类的各成员函数和属性

2.本文适用于学习QT的新手入门及练习,老手请绕路。

3.工程上传至CSDN,供同一时期学习QT的网友参考,可自行查看。

4.转载请注明出处

基本信息

时间:2024.09.13
QT版本:5.14.2
平台:window 10

程序简介:

  1. 本工程是Qt基础类和基本数据类型专题例程,QSize尺寸类

  2. 本工程对照着Qt的帮助文档,把每个属性和成员函数测试了一遍

写在前面

这个练习程序,是对照着QT中QSize的帮助文档,一个一个测试形成的。

QSize尺寸类,它主要包含的是宽度和高度,这使其在构造一个矩形,设置窗体的尺寸等等场景下,有较为广泛的应用。

但要注意,QSize和QRect的区别,一个是尺寸类,一个是矩形类。它们不是一个东西,但创建一个矩形对象时,如果它是一个有效的对象,它就一定包含宽度和高度,所以,QSize和QRect又是密切相关的。

本文链接地址 Qt基础类05-尺寸类QSize-CSDN博客,转载请注明出处。

QSize尺寸类,除了提供对宽度和高度的访问及设置外,还提供了缩放、交换宽度和高度,以及操作符重载等相关函数,如heigth(),width(),setHeigth(),setWidth(),scale(),transpose()等等函数。详见下文。

本测试程序,toCGSize()函数没有进行测试。

本测试程序,可流化的2个函数没有进行测试。

重要成员函数举例7个

工程上传至CSDN,供同一时期学习QT的网友参考,可自行查看。

这里,最基本的获取宽度,width()和heigth(),setWidth()和setHeigth()等一眼看上去就知道怎么回事儿的就不再详细介绍、不再贴代码了,只贴测试后的图片。
这里仅把新手小白可能值得一看的内容贴出来。

本测试程序全貌如下图:
在这里插入图片描述

QSize QSize::boundedTo(const QSize &otherSize) const

作用:返回一个包含此尺寸和给定otherSize的最小宽度和高度的尺寸。

这话说的,云时雾里的,看英文原文,如下:

Returns a size holding the minimum width and height of this size and the given otherSize.

这里理解的不好,返回的是一个QSize对象,在这个QSize对象,和另外一个指定的QSize对象中,取宽度和高度的最小值,返回来。

如果按此理解,测试程序得重写一下啊~!

    QPainter painter(this);

    QSize size1(100,50);
    QPoint topleftPoint1(400,200);
    QRect rect1(topleftPoint1,size1);

    painter.setPen(Qt::blue);
    painter.drawRect(rect1);

    QSize size2;
    size2=size2.boundedTo(size1);

    QPoint topleftPoint2(650,200);
    QRect rect2(topleftPoint2,size2);

    painter.setPen(Qt::red);
    painter.drawRect(rect2);

    label1->setText(tr("rect1使用size1进行构造,其宽度为:%1,高度为:%2").arg(size1.width()).arg(size1.height()));
    label2->setText(tr("rect2使用size2=size2.boundedTo(size1),其宽度为:%1,高度为:%2").arg(size2.width()).arg(size2.height()));

程序运行效果如下:
在这里插入图片描述

QSize QSize::expandedTo(const QSize &otherSize) const

作用:返回一个包含此尺寸和给定otherSize的最大宽度和高度的尺寸。

英文原文:

Returns a size holding the maximum width and height of this size and the given otherSize.

与上个函数成对儿配套来理解~!

    QPainter painter(this);

    QSize size1(100,50);
    QPoint topleftPoint1(400,200);
    QRect rect1(topleftPoint1,size1);

    painter.setPen(Qt::blue);
    painter.drawRect(rect1);

    QSize size2;
    size2=size2.expandedTo(size1);

    QPoint topleftPoint2(650,200);
    QRect rect2(topleftPoint2,size2);

    painter.setPen(Qt::red);
    painter.drawRect(rect2);

    label1->setText(tr("rect1使用size1进行构造,其宽度为:%1,高度为:%2").arg(size1.width()).arg(size1.height()));
    label2->setText(tr("rect2使用size2=size2.expandedTo(size1),其宽度为:%1,高度为:%2").arg(size2.width()).arg(size2.height()));

程序运行效果如下:
在这里插入图片描述

bool QSize::isEmpty() const

作用:如果宽度和高度中的任何一个小于等于0,则返回true;否则返回false。

这里的Empty不用管它是的“空”,翻译如何理解,想象一下,宽*高所构成的面积,只要面积为0,它就是“空”啦~!

尺寸就没有负值的概念,不说宽度为负5,高度为负6之类的,负值全部无效。

    QPainter painter(this);

    QSize size1(100,50);
    QSize size2(0,40);
    QSize size3(60,0);
    QSize size4(0,0);

    QPoint topleftPoint1(400,200);
    QPoint topleftPoint2(650,200);
    QPoint topleftPoint3(400,300);
    QPoint topleftPoint4(650,300);

    QRect rect1(topleftPoint1,size1);
    QRect rect2(topleftPoint2,size2);
    QRect rect3(topleftPoint3,size3);
    QRect rect4(topleftPoint4,size4);

    painter.setPen(Qt::blue);
    painter.drawRect(rect1);

    painter.setPen(Qt::red);
    painter.drawRect(rect2);

    painter.setPen(Qt::green);
    painter.drawRect(rect3);

    painter.setPen(Qt::darkYellow);
    painter.drawRect(rect4);

    bool result1=size1.isEmpty();
    bool result2=size2.isEmpty();
    bool result3=size3.isEmpty();
    bool result4=size4.isEmpty();

    label1->setText(tr("rect1使用size1进行构造,其宽度为:%1,其高度为:%2").arg(size1.width()).arg(size1.height()));
    label2->setText(tr("rect2使用size2进行构造,其宽度为:%1,其高度为:%2").arg(size2.width()).arg(size2.height()));
    label3->setText(tr("rect3使用size3进行构造,其宽度为:%1,其高度为:%2").arg(size3.width()).arg(size3.height()));
    label4->setText(tr("rect4使用size4进行构造,其宽度为:%1,其高度为:%2").arg(size4.width()).arg(size4.height()));

    label5->setText(tr("size1宽和高均不为0,size1.isEmpty()的结果是:%1").arg(result1>0?"true":"false"));
    label6->setText(tr("size2的宽为0,size2.isEmpty()的结果是:%1").arg(result2>0?"true":"false"));
    label7->setText(tr("size3的高为0,size3.isEmpty()的结果是:%1").arg(result3>0?"true":"false"));
    label8->setText(tr("size4的宽和高均为0,size4.isEmpty()的结果是:%1").arg(result4>0?"true":"false"));

程序运行效果如下:
在这里插入图片描述

bool QSize::isNull() const

作用:如果宽度和高度都为0,则返回true;否则返回false。

注意这里,Null是宽和高都同时为0,才为true。宽和高有一个不为0,都不能称为Null,都是false.

    QPainter painter(this);

    QSize size1(100,50);
    QSize size2(0,40);
    QSize size3(60,0);
    QSize size4(0,0);

    QPoint topleftPoint1(400,200);
    QPoint topleftPoint2(650,200);
    QPoint topleftPoint3(400,300);
    QPoint topleftPoint4(650,300);

    QRect rect1(topleftPoint1,size1);
    QRect rect2(topleftPoint2,size2);
    QRect rect3(topleftPoint3,size3);
    QRect rect4(topleftPoint4,size4);

    painter.setPen(Qt::blue);
    painter.drawRect(rect1);

    painter.setPen(Qt::red);
    painter.drawRect(rect2);

    painter.setPen(Qt::green);
    painter.drawRect(rect3);

    painter.setPen(Qt::darkYellow);
    painter.drawRect(rect4);

    bool result1=size1.isNull();
    bool result2=size2.isNull();
    bool result3=size3.isNull();
    bool result4=size4.isNull();

    label1->setText(tr("rect1使用size1进行构造,其宽度为:%1,其高度为:%2").arg(size1.width()).arg(size1.height()));
    label2->setText(tr("rect2使用size2进行构造,其宽度为:%1,其高度为:%2").arg(size2.width()).arg(size2.height()));
    label3->setText(tr("rect3使用size3进行构造,其宽度为:%1,其高度为:%2").arg(size3.width()).arg(size3.height()));
    label4->setText(tr("rect4使用size4进行构造,其宽度为:%1,其高度为:%2").arg(size4.width()).arg(size4.height()));

    label5->setText(tr("size1宽和高均不为0,size1.isNull()的结果是:%1").arg(result1>0?"true":"false"));
    label6->setText(tr("size2的宽为0,size2.isNull()的结果是:%1").arg(result2>0?"true":"false"));
    label7->setText(tr("size3的高为0,size3.isNull()的结果是:%1").arg(result3>0?"true":"false"));
    label8->setText(tr("size4的宽和高均为0,size4.isNull()的结果是:%1").arg(result4>0?"true":"false"));

程序运行效果如下:

在这里插入图片描述

bool QSize::isValid() const

作用:如果宽度和高度都等于或大于0,则返回true;否则返回false。

重要:0和正值都是true,负值为false。对应于现实世界中的宽和高,它们一定是正整数。

    QPainter painter(this);

    QSize size1(100,50);
    QSize size2(0,20);
    QSize size3(60,0);
    QSize size4(0,0);

    QSize size5(-50,10);
    QSize size6(10,-50);
    QSize size7(-50,-50);

    QPoint topleftPoint1(400,130);

    QPoint topleftPoint2(400,200);
    QPoint topleftPoint3(500,200);
    QPoint topleftPoint4(600,200);

    QPoint topleftPoint5(400,350);
    QPoint topleftPoint6(500,350);
    QPoint topleftPoint7(600,350);

    QRect rect1(topleftPoint1,size1);
    QRect rect2(topleftPoint2,size2);
    QRect rect3(topleftPoint3,size3);
    QRect rect4(topleftPoint4,size4);

    QRect rect5(topleftPoint5,size5);
    QRect rect6(topleftPoint6,size6);
    QRect rect7(topleftPoint7,size7);

    painter.setPen(Qt::blue);
    painter.drawRect(rect1);

    painter.setPen(Qt::red);
    painter.drawRect(rect2);

    painter.setPen(Qt::green);
    painter.drawRect(rect3);

    painter.setPen(Qt::darkYellow);
    painter.drawRect(rect4);

    painter.setPen(Qt::darkRed);
    painter.drawRect(rect5);

    painter.setPen(Qt::darkCyan);
    painter.drawRect(rect6);

    painter.setPen(Qt::darkMagenta);
    painter.drawRect(rect7);

    bool result1=size1.isValid();
    bool result2=size2.isValid();
    bool result3=size3.isValid();
    bool result4=size4.isValid();

    bool result5=size5.isValid();
    bool result6=size6.isValid();
    bool result7=size7.isValid();

    label1->setText(tr("rect1使用size1进行构造,其宽度为:%1,其高度为:%2").arg(size1.width()).arg(size1.height()));
    label2->setText(tr("rect2使用size2进行构造,其宽度为:%1,其高度为:%2").arg(size2.width()).arg(size2.height()));
    label3->setText(tr("rect3使用size3进行构造,其宽度为:%1,其高度为:%2").arg(size3.width()).arg(size3.height()));
    label4->setText(tr("rect4使用size4进行构造,其宽度为:%1,其高度为:%2").arg(size4.width()).arg(size4.height()));

    label5->setText(tr("size1宽和高均不为0,size1.isValid()的结果是:%1").arg(result1>0?"true":"false"));
    label6->setText(tr("size2的宽为0,size2.isValid()的结果是:%1").arg(result2>0?"true":"false"));
    label7->setText(tr("size3的高为0,size3.isValid()的结果是:%1").arg(result3>0?"true":"false"));
    label8->setText(tr("size4的宽和高均为0,size4.isValid()的结果是:%1").arg(result4>0?"true":"false"));

    label9->setText(tr("size5的宽为-50,size5.isValid()的结果是:%1").arg(result5>0?"true":"false"));
    label10->setText(tr("size6的高为-50,size6.isValid()的结果是:%1").arg(result6>0?"true":"false"));
    label11->setText(tr("size7的宽和高均为-50,size7.isValid()的结果是:%1").arg(result7>0?"true":"false"));

程序运行效果如下:
在这里插入图片描述

QSize QSize::scaled(const QSize &s, Qt::AspectRatioMode mode) const

作用:根据指定的模式,返回缩放为给定尺寸s的矩形的大小。

重要:这里&s是一个给定的尺寸,缩放之后的尺寸到底是多大,要看Qt::AspectRatioMode的设置如何,是否保持宽高比。这个按图形来理解就容易多了。

    QPainter painter(this);
    QSize size1(10,12);
    QSize size2(10,12);
    QSize size3(10,12);

    QPoint topleftPoint1(400,200);
    QPoint topleftPoint2(500,200);
    QPoint topleftPoint3(600,200);

    QRect rect1(topleftPoint1,size1);
    QRect rect2(topleftPoint2,size2);
    QRect rect3(topleftPoint3,size3);
    painter.setPen(Qt::blue);
    painter.drawRect(rect1);
    painter.drawRect(rect2);
    painter.drawRect(rect3);
    label1->setText(tr("rect1使用size1进行构造,其宽度为:%1,高度为:%2").arg(size1.width()).arg(size1.height()));
    label2->setText(tr("rect2使用size2进行构造,其宽度为:%1,高度为:%2").arg(size2.width()).arg(size2.height()));
    label3->setText(tr("rect3使用size3进行构造,其宽度为:%1,高度为:%2").arg(size3.width()).arg(size3.height()));

    QSize sizeRef(60,60);
    QSize size4=size1.scaled(sizeRef,Qt::IgnoreAspectRatio);
    QSize size5=size2.scaled(sizeRef,Qt::KeepAspectRatio);
    QSize size6=size3.scaled(sizeRef,Qt::KeepAspectRatioByExpanding);

    QPoint topleftPoint4(400,300);
    QPoint topleftPoint5(500,300);
    QPoint topleftPoint6(600,300);
    QRect rect4(topleftPoint4,size4);
    QRect rect5(topleftPoint5,size5);
    QRect rect6(topleftPoint6,size6);
    painter.setPen(Qt::red);
    painter.drawRect(rect4);
    painter.drawRect(rect5);
    painter.drawRect(rect6);

    label4->setText(tr("QSize sizeRef(60,60);"));
    label5->setText(tr("QSize size4=size1.scaled(sizeRef,Qt::IgnoreAspectRatio);"));
    label6->setText(tr("QSize size5=size2.scaled(sizeRef,Qt::KeepAspectRatio);"));
    label7->setText(tr("QSize size6=size3.scaled(sizeRef,Qt::KeepAspectRatioByExpanding);"));

    label8->setText(tr("rect4使用size1.scale()进行构造,其宽度为:%1,高度为:%2").arg(size4.width()).arg(size4.height()));
    label9->setText(tr("rect5使用size2.scale()进行构造,其宽度为:%1,高度为:%2").arg(size5.width()).arg(size5.height()));
    label10->setText(tr("rect6使用size3.scale()进行构造,其宽度为:%1,高度为:%2").arg(size6.width()).arg(size6.height()));

程序运行效果如下:
在这里插入图片描述

QSize QSize::transposed() const

作用:交换宽度和高度值。

区别:这里注意与transpose()的区别,主要看返回值。

transposed()返回的是QSize对象,而transpose()返回值是void。

    QPainter painter(this);

    QSize size1(100,50);
    QPoint topleftPoint1(400,200);
    QRect rect1(topleftPoint1,size1);
    painter.setPen(Qt::blue);
    painter.drawRect(rect1);
    label1->setText(tr("rect1使用size1进行构造,其宽度为:%1,高度为:%2").arg(size1.width()).arg(size1.height()));

    QSize size2=size1.transposed();

    QPoint topleftPoint2(600,200);
    QRect rect2(topleftPoint2,size2);
    painter.setPen(Qt::red);
    painter.drawRect(rect2);

    label2->setText(tr("rect2使用QSize size2=size1.transposed()构造,其宽度为:%1,高度为:%2").arg(size1.width()).arg(size1.height()));

程序运行效果如下:
在这里插入图片描述

技巧

  1. 在这个测试程序中,尝试设置了一下QLabel的颜色。但也发现,设置QTextEdit和设置QPushButton中字体的颜色是不一样的。脑海中盘旋着,这一个一个设置好麻烦啊~!是否有全局的方法来一起设置?先保留疑问,回头blog中见。

  2. 在我笔记本电脑2k的分辨下,调整1920**1080,然后去截取应用程序的截图,画的直线、矩形等,位置信息好像还是不太对。在2台电脑来回切换进行开发时,还是有一点儿小麻烦。

写在后面

  • 关于QSize类,其中有isEmpty(),isNull(),isValid(),这3个函数。应注意它们3个的区别。详见上文。

  • QTextEdit对象,当内容行数过多时,会自动产生垂直滚动条,滚动条的默认位置在最末尾,如何设置滚动条默认在最前端,还没有去尝试。

  • 下边是scale()函数会用到的,宽高比的设置选项Qt::AspectRatioMode,如下:

序号内容含义
1Qt::IgnoreAspectRatio大小设置为(width, height),忽略长宽比
2Qt::KeepAspectRatio保持长宽比,大小被缩放到一个矩形尽可能大的内部(宽度,高度)
3Qt:: keepaspectratiobyexpansion保持长宽比,大小被缩放到一个矩形尽可能小的外部(宽度,高度)

系列博文

Qt基础类01–坐标类QPoint-CSDN博客

Qt基础类02-坐标类QPointF-CSDN博客

Qt基础类03-直线类QLine-CSDN博客

Qt基础类04-浮点直线类QLineF-CSDN博客

Qt基础类05-尺寸类QSize-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值