(4)Qt中的位置和尺寸

简介: 本文介绍了Qt中用于处理位置和尺寸的四个核心类:QPoint、QLine、QSize和QRect,包括它们的常用API和一些基本使用示例。

QPoint

QPoint类封装了我们常用用到的坐标点 (x, y), 常用的 API如下:

void QPoint::setX(int x);
void QPoint::setY(int y);

int QPoint::x() const;
int &QPoint::rx();

int QPoint::y() const;
int &QPoint::ry();

//如果x和y坐标都为0则返回true,否则返回false
bool isNull() const

//返回x()和y()的绝对值之和,传统上称为从原点到该点的向量的“曼哈顿长度”。 
int manhattanLength() const    

//返回一个交换了x和y坐标的点:   QPoint{1, 2}.transposed() // {2, 1}  
QPoint transposed() const    

// 直接通过坐标对象进行算术运算: 加减乘除
QPoint &QPoint::operator*=(float factor);
QPoint &QPoint::operator*=(double factor);
QPoint &QPoint::operator*=(int factor);
QPoint &QPoint::operator+=(const QPoint &point);
QPoint &QPoint::operator-=(const QPoint &point);
QPoint &QPoint::operator/=(qreal divisor);

常用基本函数的使用

QPoint point(2, 3);
qInfo() << point.x() << point.y();        // 2 3

point.rx() = 100;
point.ry() = 100;
qInfo() << point.x() << point.y();        // 100 100

point.setX(200);
point.setY(300);
qInfo() << point.x() << point.y();        // 200 300
//坐标变换
QPoint point(2, 3);
qInfo() << point;                    //    QPoint(2, 3)
qInfo() << point.transposed();        //     QPoint(3, 2)
QPoint p1(2, 2);
QPoint p2(4, 5);
//求曼哈顿距离
qInfo() << p1.manhattanLength();            //    4
//求两点之间的曼哈顿距离
qInfo() << (p1 - p2).manhattanLength();        //    5

QLine

QLine是一个直线类, 封装了两个坐标点 (两点确定一条直线),常用API如下:

// 设置直线的起点坐标
void setP1(const QPoint &p1);
// 设置直线的终点坐标
void setP2(const QPoint &p2);

void setPoints(const QPoint &p1, const QPoint &p2);
void setLine(int x1, int y1, int x2, int y2);

QPoint p1() const;        // 返回直线的起始点坐标
QPoint p2() const;        // 返回直线的终点坐标
QPoint center() const;    // 返回值直线的中心点坐标, (p1() + p2()) / 2    

int x1() const;        // 返回值直线起点的 x 坐标
int y1() const;        // 返回值直线起点的 y 坐标
int x2() const;        // 返回值直线终点的 x 坐标
int y2() const;        // 返回值直线终点的 y 坐标

int dx() const            //返回直线向量的水平分量  
int dy() const            //返回直线向量的垂直分量  

// 用给定的坐标点平移这条直线
void translate(const QPoint &offset);
void translate(int dx, int dy);
// 用给定的坐标点平移这条直线, 返回平移之后的坐标点(不会改变这条线的坐标)
QLine translated(const QPoint &offset) const;
QLine translated(int dx, int dy) const;

// 直线对象进行比较
bool operator!=(const QLine &line) const;
bool operator==(const QLine &line) const;
QLine line(0, 0, 6, 3);
qInfo() << line;

qInfo() << line.dx() << line.dy();        // 6,3  xy轴上的增量

line.translate(1, 2);
qInfo() << line;                        // 1,2,7,5

qInfo() << line.translated(-1, -2);        // 临时的,原来的不变 0,0,6,3
qInfo() << line;                        // 1,2,7,5

QSize

在QT中QSize类用来形容长度和宽度, 常用的API如下:

void setWidth(int width)
void setHeight(int height);

int width() const;        // 得到宽度
int &rwidth();            // 得到宽度的引用
int height() const;        // 得到高度
int &rheight();            // 得到高度的引用

void transpose();            // 交换高度和宽度的值
QSize transposed() const;    // 交换高度和宽度的值, 返回交换之后的尺寸信息

//返回一个大小,宽为当前大小与other的最小值,高为当前大小与other的最小值
QSize boundedTo(const QSize& oterSize)
//返回一个大小,宽为当前大小与other的最大值,高为当前大小与other的最大值    
QSize expandedTo(const QSize &otherSize) const    

/*
根据指定的模式,按给定的宽度和高度缩放矩形:  
    如果mode为Qt::IgnoreAspectRatio,则大小设置为(width, height)。  
    如果mode为Qt::KeepAspectRatio,当前大小将在内部缩放到一个尽可能大的矩形(宽度,高度),保持高宽比。  
    如果mode是Qt::KeepAspectRatioByExpanding,当前大小被缩放到一个矩形,尽可能小的外部(宽度,高度),保持长宽比。  
*/
void scale(int width, int height, Qt::AspectRatioMode mode)
void scale(const QSize &size, Qt::AspectRatioMode mode)
QSize scaled(int width, int height, Qt::AspectRatioMode mode) const
QSize scaled(const QSize &s, Qt::AspectRatioMode mode) const

// 进行算法运算: 加减乘除
QSize &operator*=(qreal factor);
QSize &operator+=(const QSize &size);
QSize &operator-=(const QSize &size);
QSize &operator/=(qreal divisor);
QSize size(640, 480);
qInfo() << size;
qInfo() << size.transposed();        //    不改变原来的

QSize size1(640, 480);
QSize size2(960, 320);
qInfo() << size1.boundedTo(size2);    //    构造一个最小的size
qInfo() << size1.expandedTo(size2); //    构造一个最大的size

//缩放  直接缩放(随意缩放)
qInfo() << QSize(250, 320).scaled(100, 100,
    Qt::AspectRatioMode::IgnoreAspectRatio);

//保持宽高比最小等比缩放
qInfo() << QSize(200, 400).scaled(100, 100,
    Qt::AspectRatioMode::KeepAspectRatio);

//保持宽高比最大等比缩放
qInfo() << QSize(200, 400).scaled(100, 100,
    Qt::AspectRatioMode::KeepAspectRatioByExpanding);

QRect

在Qt中使用 QRect类来描述一个矩形, 常用的API如下:

// 构造一个空对象
QRect::QRect();
// 基于左上角坐标, 和右下角坐标构造一个矩形对象
QRect::QRect(const QPoint &topLeft, const QPoint &bottomRight);
// 基于左上角坐标, 和宽度, 高度构造一个矩形对象
QRect::QRect(const QPoint &topLeft, const QSize &size);
// 通过左上角坐标(x, y), 和矩形尺寸(width, height) 构造一个矩形对象
QRect::QRect(int x, int y, int width, int height);

// 设置矩形的尺寸信息, 左上角坐标不变
void QRect::setSize(const QSize &size);
// 设置矩形左上角坐标为(x,y), 大小为(width, height)
void QRect::setRect(int x, int y, int width, int height);
// 设置矩形宽度
void QRect::setWidth(int width);
// 设置矩形高度
void QRect::setHeight(int height);

// 返回值矩形左上角坐标
QPoint QRect::topLeft() const;
// 返回矩形右上角坐标
// 该坐标点值为: QPoint(left() + width() -1, top())
QPoint QRect::topRight() const;
// 返回矩形左下角坐标
// 该坐标点值为: QPoint(left(), top() + height() - 1)
QPoint QRect::bottomLeft() const;
// 返回矩形右下角坐标
// 该坐标点值为: QPoint(left() + width() -1, top() + height() - 1)
QPoint QRect::bottomRight() const;
// 返回矩形中心点坐标
QPoint QRect::center() const;

// 返回矩形上边缘y轴坐标
int QRect::top() const;
int QRect::y() const;
// 返回值矩形下边缘y轴坐标
int QRect::bottom() const;
// 返回矩形左边缘 x轴坐标
int QRect::x() const;
int QRect::left() const;
// 返回矩形右边缘x轴坐标
int QRect::right() const;

// 返回矩形的高度
int QRect::width() const;
// 返回矩形的宽度
int QRect::height() const;
// 返回矩形的尺寸信息
QSize QRect::size() const;

//调整矩形的尺寸 (左上角和右下角坐标偏移量)
void QRect::adjust(int dx1, int dy1, int dx2, int dy2)
QRect QRect::adjusted(int dx1, int dy1, int dx2, int dy2) const

基本属性的获取

QRect rect(0, 0, 5, 6);   //  左上角点坐标 宽高
qInfo() << rect;          //  QRect(0,0 5x6)

//获取属性
qInfo() << rect.x() << rect.y() << rect.width() << rect.height();    //    0 0 5 6

基本属性的设置

QRect rect(0, 0, 5, 6);   //  左上角点坐标 宽高

//设置属性
rect.setRect(5, 5, 5, 5);
rect.setX(0);
rect.setY(0);
qInfo() << rect;            //    QRect(0,0 10x10)

qInfo() << rect.topLeft()    //    QPoint(0,0)   
    << rect.topRight()        //    QPoint(9,0)
    << rect.bottomLeft()    //    QPoint(0,9)
    << rect.bottomRight();    //    QPoint(9,9)

矩形的移动

//矩形的移动
QRect r(0, 0, 8, 8);
r.moveTo(1, 1);
qInfo() << r;                //    QRect(1,1 8x8)

//移动中心点
r.moveTo(0, 0);                //    移动回原来的位置
r.moveCenter(QPoint(0, 0));    //    将中心点移动到(0,0)的位置
qInfo() << r;                //    QRect(-3,-3 8x8)

矩形尺寸的调整

//调整矩形尺寸
qInfo() << QRect(0, 0, 640, 480).adjusted(5, 5, -5, -5);    //    QRect(5,5 630x470)

浮点型版本的矩阵

//浮点型版本
qInfo() << QRectF(1.1, 1.1, 5.1, 5.1);    //    QRectF(1.1,1.1 5.1x5.1)
相关文章
|
28天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
4天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
442 17
|
7天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
20天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
7天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
380 2
|
22天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
24天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2600 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
6天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
289 2
|
4天前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
106 65
|
24天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1582 17
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码