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

posted @ 2024-05-27 01:40  蜡笔小新Pointer  阅读(65)  评论(0)    收藏  举报