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模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓