Qt中的坐标系统
Qt使用统一的坐标系统来定位窗口部件的位置和大小。

以屏幕的左上角为原点即(0, 0)点,从左向右为x轴正向,从上向下为y轴正向,这整个屏幕的坐标系统就用来定位顶层窗口;
此外,窗口内部也有自己的坐标系统,它依然以左上角作为原点,从左向右为x轴正向,从上向下为y轴正向,原点、x轴、y轴围成的区域叫做Client Area(客户区),在客户区的周围则是标题栏(Windows Title)和边框(Frame)。
有了Qt坐标系统的一些基础概念,那么具体该如何来进行窗口部件的定位呢?QWidget类,也就是所有窗口组件的父类都提供了成员函数来在坐标系统中进行定位。

从上图可以看出这些成员函数有三类:
——QWidget直接提供的成员函数:x()、y()获得窗口左上角的坐标,width()、height()获得客户区的宽和高
——QWidget的geometry()提供的成员函数:x()、y()获得客户区左上角的坐标,width()、height()获得客户区的宽和高
——QWidget的frameGeometry()提供的成员函数:x()、y()获得窗口左上角的坐标,width()、height()获得包含客户区、标题栏和边框在内的整个窗口的宽和高
测试程序:
#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui/QWidget>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget();
~Widget();
};
#endif // WIDGET_H
#include "Widget.h"
Widget::Widget()
{
}
Widget::~Widget()
{
}
#include <QtGui/QApplication>
#include <QPushButton>
#include <QDebug>
#include "Widget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
QPushButton b(&w);
b.setText("Button");
b.resize(, );
b.move(, ); //以Client Area左上角为(0, 0)点
w.resize(, ); //不同操作系统可能对窗口最小宽度有规定,若设置宽度小于规定值,则会以规定值进行显示
w.move(, ); //以屏幕左上角为(0, 0)点
w.show();
qDebug() << "QWidget";
qDebug() << w.x();
qDebug() << w.y();
qDebug() << w.width();
qDebug() << w.height();
qDebug() << "QWidget::geometry";
qDebug() << w.geometry().x();
qDebug() << w.geometry().y();
qDebug() << w.geometry().width();
qDebug() << w.geometry().height();
qDebug() << "QWidget::frameGeometry";
qDebug() << w.frameGeometry().x();
qDebug() << w.frameGeometry().y();
qDebug() << w.frameGeometry().width();
qDebug() << w.frameGeometry().height();
return a.exec();
}
输出结果:

在上面这个程序中,有两点需要补充说明:
第一,geometry()和frameGeometry()提供的坐标函数必须在show()调用之后使用才有效,否则会得到无效的数据;
第二,不同的操作系统可能对窗口的最小宽度有所规定,在使用void resize(int width, int height)设置顶层窗口大小时,若width小于规定的最小宽度,则会以规定的最小宽度进行显示,经个人测试,这个最小宽度对于win7 x64为116,对于win8.1 x64为160,因此在编写跨平台的程序时,有时候可能需要考虑到这个特性。
说到跨平台,这里还有一个问题:在不同的平台中(如windows和linux),窗口的外观式样是不一样的,这种差异体现在边框的宽度不一样、标题栏的宽度和高度不一样。Qt之所以在坐标系统相关的函数中,提供三组不同的函数出来,正是为了实现跨平台。
因为图形用户界面一般都是以像素为单位进行定位的,因此若想以跨平台的方式精确定位,就必须考虑到不同平台标题栏和边框的大小差异,QWidget围绕标题栏和边框提供的三组既相互联系又相互区别的函数,就可以解决这个问题。
Qt中的坐标系统的更多相关文章
- 第7课 Qt中的坐标系统
1. 坐标系统 (1)GUI操作系统都有特定的坐标系统 (2)图形界面程序在坐标系统中进行窗口和部件的定位 (3)定位类型 ①顶级窗口部件的定位 ②窗口内部件的定位 ③窗口部件的大小设置 (4)QWi ...
- Qt中的内存回收机制
Qt中的内存回收机制 在Qt中创建对象的时候会提供一个 Parent对象指针(可以查看类的构造函数),下面来解释这个parent到底是干什么的. QObject是以对象树的形式组织起来的.当你创建一个 ...
- Qt 中使用Singleton模式需小心
在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...
- qt中ui的 使用介绍
1.什么是ui?ui通常是用Qt 设计师设计出来的界面文件的后缀.通常情况下ui是一个指向这个界面类的指针.ui-> 一般就是用来访问这个界面类里面的控件.例如你的ui文件里有一个叫okButt ...
- Qt中 QString 和int, char等的“相互”转换
转载:http://blog.csdn.net/ei__nino/article/details/7297791 Qt中 int ,float ,double转换为QString 有两种方法 1.使用 ...
- QT 中 关键字讲解(emit,signal,slot)
Qt中的类库有接近一半是从基类QObject上继承下来,信号与反应槽(signals/slot)机制就是用来在QObject类或其子类间通讯的方法.作为一种通用的处理机制,信号与反应槽非常灵活,可以携 ...
- ArcGIS中的坐标系统定义与投影转换【转】
ArcGIS中的坐标系统定义与投影转换 坐标系统是GIS数据重要的数学基础,用于表示地理要素.图像和观测结果的参照系统,坐标系统的定义能够保证地理数据在软件中正确的显示其位置.方向和距离,缺少坐标系统 ...
- 第47课 Qt中的调色板
1. QPalette类 (1)QPalette类提供了绘制QWidget组件的不同状态所使用的颜色. (2)QPalette对象包含了3个状态的颜色描述 ①激活颜色组(Active):组件获得焦点使 ...
- 第39课 Qt中的事件处理(下)
1. 事件的传递过程 (1)操作系统检测到用户动作时,会产生一条系统消息,该消息被发送到Qt应用程序 (2)Qt应用程序收到系统消息后,将其转化为一个对应的QEvent事件对象,并调用QObject: ...
随机推荐
- HTTPS 证书配置
HTTPS 证书配置 现在阿里云和腾讯云都支持申请 HTTPS 证书,这里不再提,有需要的可自行google解决方案. 本文主要介绍的是通过 letsencrypt 申请免费的HTTPS证书,并将其配 ...
- 一位资深程序员大牛给予Java提升技术的学习路线建议
15套java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战视频教程 ...
- 介绍下Python的两个标准库 os 和 sys
import sysprint(sys.path) #python 2 中报错 ....,打印的是绝对路径(***\\python\\lib\\site-packages# 第三方库,后退一级为标准库 ...
- 一只菜鸟的瞎J8封装系列的目录
因为这是一个系列...也就是我们所说的依赖关系.后面很多方法都是基于我前面封装的工具来进行的,所以我列一个目录供大家参考... 一只菜鸟的瞎J8封装系列 一.手把手封装数据层之DButil数据库连接 ...
- 在ubantu上安装hive
上次我们在ubantu上安装了hadoop,那我们现在再进一步,开始我们的学习之旅--hive板块吧! 第一步:准备! 软件: I.一个搭建好的hadoop环境 II.hive的bin文件(前往apa ...
- Mybatis映射文件完整模板参照
Mybatis映射文件完整模板参照 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE map ...
- Java jdk 快速配置
JAVA_HOME C:\Program Files\Java\jdk1.8.0_92 Path %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; CLASSPATH ...
- ios 初体验<UILabel控件>
创建控件: UILabel *label = [[UILabel alloc]init]; //设置控件大小 label.frame = CGRectMake(50,100,300,40);//分别为 ...
- distinct和group by 去掉重复数据分析
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp40 用distinct关键字只能过滤查询字段中所有记录相同的(记录集相同) ...
- Jquery的入门学习
jQuery API中文文档地址 http://www.jquery123.com/ Jquery w3school教程 http://www.w3school.com.cn/jquery/index ...