Qt位置相关函数

Qt提供了很多关于获取窗体位置及显示区域大小的函数,如​​x()​​​,​​y()​​​和​​pos()​​​,​​rect()​​​,​​size()​​​,​​geometry()​​等,统称为"位置相关函数"或"位置函数"。几种主要位置函数及其之间的区别如下图所示:

 本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

其中,

​​x()​​​,​​y()​​和​​pos()​​函数的作用都是获得整个窗体左上角的坐标位置。

​​frameGeometry()​​​函数和​​geometry()​​函数相对应。​​frameGeometry()​​函数获得的是整个窗体的左上顶点和长、宽值,而​​geometry()​​函数获得的是窗体内中央区域的左上顶点坐标及长、宽值。

直接调用​​width()​​和​​height()​​函数获得的是中央区域的长、宽值。

​​rect()​​​、​​size()​​函数获得的结果都是相对于窗体的中央区域而言的。​​size()​​函数获得的是窗体中央区域的长、宽值。​​rect()​​函数与​​geometry()​​函数相同,返回一个​​QRect​​对象,这两个函数获得的长、宽值是相同的,都是窗体中央区域的长、宽值,只是左上顶点的坐标值不一样。​​geometry()​​函数获得的左上顶点坐标是相对于父窗体而言的坐标,而​​rect()​​函数获得的左上顶点坐标始终为(0,0)。

在实际应用中,需要根据情况使用正确的位置信息函数以获得准确的位置尺寸信息,尤其是在编写对位置精度要求较高的程序(如地图浏览程序)时,更应注意函数的选择,以避免产生不必要的误差。

下面通过一个实例来介绍它的使用:

一、运行结果

 

从结果中明显可以看到各个位置函数的区别,具体区别参考上面的区别图;

二、具体代码

​​geometry.h​​

#ifndef GEOMETRY_H
#define GEOMETRY_H

#include <QDialog>
#include <QLabel>
#include <QGridLayout>

class Geometry : public QDialog
{
    Q_OBJECT

public:
    Geometry(QWidget *parent = 0);
    ~Geometry();
    void updateLabel();

private:
    QLabel *xLabel;
    QLabel *xValueLabel;
    QLabel *yLabel;
    QLabel *yValueLabel;
    QLabel *FrmLabel;
    QLabel *FrmValueLabel;
    QLabel *posLabel;
    QLabel *posValueLabel;
    QLabel *geoLabel;
    QLabel *geoValueLabel;
    QLabel *widthLabel;
    QLabel *widthValueLabel;
    QLabel *heightLabel;
    QLabel *heightValueLabel;
    QLabel *rectLabel;
    QLabel *rectValueLabel;
    QLabel *sizeLabel;
    QLabel *sizeValueLabel;
    QGridLayout *mainLayout;

protected:
    void moveEvent(QMoveEvent *);
    void resizeEvent(QResizeEvent *);
};

#endif // GEOMETRY_H

​​geometry.cpp​​

#include "geometry.h"

Geometry::Geometry(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle(tr("Geometry"));
    xLabel = new QLabel(tr("x(): "));
    xValueLabel = new QLabel;
    yLabel = new QLabel(tr("y(): "));
    yValueLabel = new QLabel;
    FrmLabel = new QLabel(tr("Frame(): "));
    FrmValueLabel = new QLabel;
    posLabel = new QLabel(tr("pos(): "));
    posValueLabel = new QLabel;
    geoLabel = new QLabel(tr("geometry(): "));
    geoValueLabel = new QLabel;
    widthLabel = new QLabel(tr("width(): "));
    widthValueLabel = new QLabel;
    heightLabel = new QLabel(tr("height(): "));
    heightValueLabel = new QLabel;
    rectLabel = new QLabel(tr("rect(): "));
    rectValueLabel = new QLabel;
    sizeLabel = new QLabel(tr("size(): "));
    sizeValueLabel = new QLabel;
    mainLayout = new  QGridLayout(this);
    mainLayout->addWidget(xLabel,0,0);
    mainLayout->addWidget(xValueLabel,0,1);
    mainLayout->addWidget(yLabel,1,0);
    mainLayout->addWidget(yValueLabel,1,1);
    mainLayout->addWidget(posLabel,2,0);
    mainLayout->addWidget(posValueLabel,2,1);
    mainLayout->addWidget(FrmLabel,3,0);
    mainLayout->addWidget(FrmValueLabel,3,1);
    mainLayout->addWidget(geoLabel,4,0);
    mainLayout->addWidget(geoValueLabel,4,1);
    mainLayout->addWidget(widthLabel,5,0);
    mainLayout->addWidget(widthValueLabel,5,1);
    mainLayout->addWidget(heightLabel,6,0);
    mainLayout->addWidget(heightValueLabel,6,1);
    mainLayout->addWidget(rectLabel,7,0);
    mainLayout->addWidget(rectValueLabel,7,1);
    mainLayout->addWidget(sizeLabel,8,0);
    mainLayout->addWidget(sizeValueLabel,8,1);
    updateLabel();
}

Geometry::~Geometry()
{

}

void Geometry::updateLabel()
{
    QString xStr;
    xValueLabel->setText(xStr.setNum(x()));
    QString yStr;
    yValueLabel->setText(yStr.setNum(y()));
    QString frameStr;
    QString tempStr1,tempStr2,tempStr3,tempStr4;
    frameStr = tempStr1.setNum(frameGeometry().x())+","+
               tempStr2.setNum(frameGeometry().y())+","+
               tempStr3.setNum(frameGeometry().width())+","+
               tempStr4.setNum(frameGeometry().height());
    FrmValueLabel->setText(frameStr);
    QString positionStr;
    QString tempStr11,tempStr12;
    positionStr = tempStr11.setNum(pos().x())+","+
                  tempStr12.setNum(pos().y());
    posValueLabel->setText(positionStr);
    QString geoStr;
    QString tempStr21,tempStr22,tempStr23,tempStr24;
    geoStr = tempStr21.setNum(geometry().x())+","+
             tempStr22.setNum(geometry().y())+","+
             tempStr23.setNum(geometry().width())+","+
             tempStr24.setNum(geometry().height());
    geoValueLabel->setText(geoStr);
    QString wStr,hStr;
    widthValueLabel->setText(wStr.setNum(width()));
    heightValueLabel->setText(hStr.setNum(height()));
    QString rectStr;
    QString tempStr31,tempStr32,tempStr33,tempStr34;
    rectStr = tempStr31.setNum(rect().x())+","+
             tempStr32.setNum(rect().y())+","+
             tempStr33.setNum(/*rect.width()*/width())+","+
             tempStr34.setNum(height()/*rect.height()*/);
    rectValueLabel->setText(rectStr);
    QString sizeStr;
    QString tempStr41,tempStr42;
    sizeStr = tempStr41.setNum(size().width())+","+
              tempStr42.setNum(size().height());
    sizeValueLabel->setText(sizeStr);
}

void Geometry::moveEvent(QMoveEvent *event)
{
    updateLabel();
}

void Geometry::resizeEvent(QResizeEvent *event)
{
    updateLabel();
}

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值