6.1 Qt5位置相关函数
6.1 Qt5位置相关函数
6.1.1 区别概述
Qt提供了很多有关与获取窗口位置及其窗口的显示区域大小的函数,如x(),y(),pos(),rect(),size(),geometry()等,我们把这些函数统称为"位置相关函数"或"位置函数",如图(6.1.png)展示了这几种位置函数的区别

其中:
* x(),y(),pos()都是描述的是整个窗体的最左上角的x坐标和y坐标以及pos位置
* frameGeometry则描述的也是整个窗体的相关的值,它的width和height也是整个窗口的长和宽
* geometry则描述的是窗口中客户区的坐标信息,它的width和height也是客户区窗口的长和宽和直接的width和height一样
* rect()和size()函数获得的结果也是对应客户区的区域而言的,size()获得的是客户区区域的长和宽,而rect()也是和geometry()一样也是客户区的一个Rect对象,这两个函数所获取的都是一样的(都表示客户区区域的长和宽),只不过左上角的顶点坐标不一样,geometry获取的坐标是相对于父窗口而言的,但rect()获得的客户区的左上角顶点坐标始终是(0,0)
6.1.2 使用举例
我们通过一个简单的例子来说明QWidget提供的这些位置函数的使用的区别,以及当我们拖动QWidget的大小时,看看这些函数之间展示的结果是否会有所不同。
1.创建Qt GUI项目,类名为Geometry,基类选择QDialog,然后不要勾选创建UI界面的复选框。
2.在geometry.h中写以下内容
#ifndef GEOMETRY_H
#define GEOMETRY_H
#include <QDialog>
#include <QLabel>
#include <QGridLayout>
class Geometry : public QDialog
{
Q_OBJECT
public:
Geometry(QWidget *parent = nullptr);
~Geometry();
private:
QLabel*m_x;
QLabel*m_y;
QLabel*m_pos;
QLabel*m_frame;
QLabel*m_geometry;
QLabel*m_width;
QLabel*m_height;
QLabel*m_rect;
QLabel*m_size;
//显示数据Label
QLabel*m_xValue;
QLabel*m_yValue;
QLabel*m_posValue;
QLabel*m_frameValue;
QLabel*m_geometryValue;
QLabel*m_widthValue;
QLabel*m_heightValue;
QLabel*m_rectValue;
QLabel*m_sizeValue;
private:
QGridLayout*m_mainLayout;
private:
void updateData();//更新Label里面的数据
protected:
void moveEvent(QMoveEvent*event) override;//重写窗口移动之后的事件
void resizeEvent(QResizeEvent *) override;//重写窗口的大小被改变之后的事件
};
#endif // GEOMETRY_H
2.在geometry.cpp中编写以下内容
#include "geometry.h"
Geometry::Geometry(QWidget *parent):QDialog(parent)
{
m_mainLayout = new QGridLayout(this);
//显示Label
m_x = new QLabel(tr("x():"));
m_y = new QLabel(tr("y():"));
m_pos = new QLabel(tr("pos():"));
m_frame = new QLabel(tr("Frame:"));
m_geometry = new QLabel(tr("geometry():"));
m_width = new QLabel(tr("width():"));
m_height = new QLabel(tr("height():"));
m_rect = new QLabel(tr("rect():"));
m_size = new QLabel(tr("size():"));
//数据显示Label
m_xValue = new QLabel;
m_yValue = new QLabel;
m_posValue = new QLabel;
m_frameValue = new QLabel;
m_geometryValue = new QLabel;
m_widthValue = new QLabel;
m_heightValue = new QLabel;
m_rectValue = new QLabel;
m_sizeValue = new QLabel;
//布局
m_mainLayout->addWidget(m_x,0,0);
m_mainLayout->addWidget(m_xValue,0,1);
m_mainLayout->addWidget(m_y,1,0);
m_mainLayout->addWidget(m_yValue,1,1);
m_mainLayout->addWidget(m_pos,2,0);
m_mainLayout->addWidget(m_posValue,2,1);
m_mainLayout->addWidget(m_frame,3,0);
m_mainLayout->addWidget(m_frameValue,3,1);
m_mainLayout->addWidget(m_geometry,4,0);
m_mainLayout->addWidget(m_geometryValue,4,1);
m_mainLayout->addWidget(m_width,5,0);
m_mainLayout->addWidget(m_widthValue,5,1);
m_mainLayout->addWidget(m_height,6,0);
m_mainLayout->addWidget(m_heightValue,6,1);
m_mainLayout->addWidget(m_rect,7,0);
m_mainLayout->addWidget(m_rectValue,7,1);
m_mainLayout->addWidget(m_size,8,0);
m_mainLayout->addWidget(m_sizeValue,8,1);
}
Geometry::~Geometry()
{
delete m_x;
delete m_y;
delete m_pos;
delete m_frame;
delete m_geometry;
delete m_width;
delete m_height;
delete m_rect;
delete m_size;
delete m_xValue;
delete m_yValue;
delete m_posValue;
delete m_frameValue;
delete m_geometryValue;
delete m_widthValue;
delete m_heightValue;
delete m_rectValue;
delete m_sizeValue;
delete m_mainLayout;
}
void Geometry::updateData()
{
m_xValue->setText(QString::number(this->x()));
m_yValue->setText(QString::number(this->y()));
m_posValue->setText(QString("(%1,%2)").arg(QString::number(this->pos().x())).arg(QString::number(this->pos().y())));
m_frameValue->setText(QString("(%1,%2,%3,%4)").arg(QString::number(this->frameGeometry().x())).arg(QString::number(this->frameGeometry().y())).arg(QString::number(this->frameGeometry().width())).arg(QString::number(this->frameGeometry().height())));
m_geometryValue->setText(QString("(%1,%2,%3,%4)").arg(QString::number(this->geometry().x())).arg(QString::number(this->geometry().y())).arg(QString::number(this->geometry().width())).arg(QString::number(this->geometry().height())));
m_widthValue->setText(QString::number(this->width()));
m_heightValue->setText(QString::number(this->height()));
m_rectValue->setText(QString("(%1,%2,%3,%4)").arg(QString::number(this->rect().x())).arg(QString::number(this->rect().y())).arg(QString::number(this->rect().width())).arg(QString::number(this->rect().height())));
m_sizeValue->setText(QString("(%1,%2)").arg(QString::number(this->size().width())).arg(QString::number(this->size().height())));
}
void Geometry::moveEvent(QMoveEvent *event)
{
updateData();
}
void Geometry::resizeEvent(QResizeEvent *)
{
updateData();
}
3.运行效果

本小结代码:https://files.cnblogs.com/files/blogs/792763/Geometry.zip?t=1716745168&download=true

浙公网安备 33010602011771号