(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)
相关文章
PyQt5-Qt Designer中控件的尺寸相关设置(sizePolicy策略)
PyQt5-Qt Designer中控件的尺寸相关设置(sizePolicy策略)
276 1
|
5月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
205 1
|
4月前
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
119 0
|
3月前
|
开发工具 C++
qt开发技巧与三个问题点
本文介绍了三个Qt开发中的常见问题及其解决方法,并提供了一些实用的开发技巧。
|
3月前
|
4月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
212 2
Qt开发网络嗅探器02
Qt开发网络嗅探器02
|
4月前
|
存储 运维 监控
Qt开发网络嗅探器01
Qt开发网络嗅探器01
|
4月前
|
网络协议 容器
Qt开发网络嗅探器03
Qt开发网络嗅探器03
|
4月前
【qt】多窗口开发
【qt】多窗口开发
78 0