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

其中,

  • 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_OBJECTpublic: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之位置相关函数相关推荐

  1. QT5开发及实例学习之十五Qt5位置相关函数

    一.区别概述   Qt 提供了很多关于获取窗体位置及显示区域大小的函数,如 x().y() 和 pos().rect().size().geometry() 等,统称为"位置相关函数&quo ...

  2. 关于从零开始学习qt制作蓝牙app和PC端的记录

    1.提前准备学习 由于本人在此之前只学习过C语言,了解到QT制作会用到C++的基础部分,所以提前学习了C++,大概花费三天 接下来学习QT 推荐B站学习 基本只需要学习基本使用 后面实践才是最重要的 ...

  3. 学习QT之信号槽机制详解

    学习QT之信号槽机制详解 一.Qt信号槽机制 概念:信号槽是Qt框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如:按钮检测到自己被点击了一下,它就会发出一个信号(sig ...

  4. 学习Qt的资源-网站、论坛、博客等

    来自<零基础学Qt 4编程>一书的附录 附录C Qt资源 C.1 Qt 官方资源 全球各大公司以及独立开发人员每天都在加入 Qt 的开发社区.他们已经认识到了Qt 的架构本身便可加快应用程 ...

  5. 嵌入式开发必须学习qt吗?

    作为一名嵌入式开发行者QT是必须要学的,也许现在不学以后也要学习的.一方面,在嵌入式初学阶段,也就是裸机开发,可能需要自己写上位机,QT就是一个做上位机的一个好用的工具,一般只要会c++学习QT一天就 ...

  6. 学习Qt的资源论坛博客等

    1 Qt 官方资源 全球各大公司以及独立开发人员每天都在加入 Qt 的开发社区.他们已经认识到了Qt 的架构本身便可加快应用程序开发进度.这些开发人员,无论是想开发单平台软件.还是想开发跨平台软件,都 ...

  7. Qt入门学习——Qt Creator的使用

    Qt Creator介绍 通过前面<Qt快速入门(vim纯代码编写)>的学习得知,只有搭建好了 Qt 环境(Qt库和开发工具),即可通过 vim 纯代码编写 Qt 程序,再借助 Qt 里的 ...

  8. 学习 Qt 编程的好书精品推荐!

    学习 Qt 编程的好书精品推荐! 最近一段时间,准备开始搞Qt方面的东西,想找几本书看看.网上介绍QT的书籍也有很多,不想浪费时间,所以想找几本精品的书籍来看.花了半天的时间找了几本非常不错的,这里面 ...

  9. qstring如何初始化_学习QT之QString详解

    学习QT之QString详解 QString类保存16位Unicode值,提供了丰富的操作.查询和转换函数.该类还进行了使用隐式共享.高效的内存分配策略等多方面的优化. 一.字符串常用操作 字符串的操 ...

  10. QT5百度地图开发学习——qt调用输入位置坐标位置进行百度地图定位

    系列文章目录 上一章: QT5百度地图开发学习--JavaScript调用qt函数并传参给qt 文章目录 系列文章目录 前言 一.界面设计 二.槽函数 总结 前言 本文实现输入坐标然后在地图上显示位置 ...

最新文章

  1. 「小程序JAVA实战」小程序头像图片上传(下)(45)
  2. Java设计模式——为什么要用枚举实现单例模式(避免反射、序列化问题)
  3. c 输出空格_Python编程第2课,认识打印输出函数print,17个案例详解5个参数
  4. VTK:图像高斯平滑用法实战
  5. java native 例子_Java native方法以及JNI实践
  6. 〈转贴〉如何解决 Windows XP 中的硬件和软件驱动程序问题
  7. 移动互联网派生app研究报告
  8. Python编程的10个经典错误及解决办法
  9. 不用掉一根头发!用 Flutter + Dart 快速构建一款绝美移动 App
  10. 浅谈 block(1) – clang 改写后的 block 结构
  11. 安装SAS University Edition
  12. FPGA硬件加速综述
  13. 什么是cosmos?
  14. Android Intent 机制解析 - Intent 是什么?作用是什么?
  15. java声卡录音_win10下程序无法录音或使用麦克风
  16. 云服务器构建微信公众号管理系统
  17. windows 7 多用户登陆
  18. JAVA一些基础概念
  19. 你应该知道的50个项目管理术语(上)
  20. 中间件 | Redis - [数据类型 指令]

热门文章

  1. 佳能Canon PIXMA MP492 打印机驱动
  2. 记录Linux开发板串口调试、静态ip
  3. python电影爬虫系统毕设_基于Python的豆瓣电影网络爬虫设计
  4. 对称加密算法和非对称加密算法的区别
  5. 创建oracle数据库实例
  6. keil4for51与keil4forARM的安装与兼容
  7. 使用apt更新和升级系统软件
  8. HTML如何下载文件
  9. java jemalloc_jemalloc 快速上手攻略
  10. 好用的5款火狐浏览器必备插件,每一款都很实用