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中的坐标系统的更多相关文章

  1. 第7课 Qt中的坐标系统

    1. 坐标系统 (1)GUI操作系统都有特定的坐标系统 (2)图形界面程序在坐标系统中进行窗口和部件的定位 (3)定位类型 ①顶级窗口部件的定位 ②窗口内部件的定位 ③窗口部件的大小设置 (4)QWi ...

  2. Qt中的内存回收机制

    Qt中的内存回收机制 在Qt中创建对象的时候会提供一个 Parent对象指针(可以查看类的构造函数),下面来解释这个parent到底是干什么的. QObject是以对象树的形式组织起来的.当你创建一个 ...

  3. Qt 中使用Singleton模式需小心

    在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...

  4. qt中ui的 使用介绍

    1.什么是ui?ui通常是用Qt 设计师设计出来的界面文件的后缀.通常情况下ui是一个指向这个界面类的指针.ui-> 一般就是用来访问这个界面类里面的控件.例如你的ui文件里有一个叫okButt ...

  5. Qt中 QString 和int, char等的“相互”转换

    转载:http://blog.csdn.net/ei__nino/article/details/7297791 Qt中 int ,float ,double转换为QString 有两种方法 1.使用 ...

  6. QT 中 关键字讲解(emit,signal,slot)

    Qt中的类库有接近一半是从基类QObject上继承下来,信号与反应槽(signals/slot)机制就是用来在QObject类或其子类间通讯的方法.作为一种通用的处理机制,信号与反应槽非常灵活,可以携 ...

  7. ArcGIS中的坐标系统定义与投影转换【转】

    ArcGIS中的坐标系统定义与投影转换 坐标系统是GIS数据重要的数学基础,用于表示地理要素.图像和观测结果的参照系统,坐标系统的定义能够保证地理数据在软件中正确的显示其位置.方向和距离,缺少坐标系统 ...

  8. 第47课 Qt中的调色板

    1. QPalette类 (1)QPalette类提供了绘制QWidget组件的不同状态所使用的颜色. (2)QPalette对象包含了3个状态的颜色描述 ①激活颜色组(Active):组件获得焦点使 ...

  9. 第39课 Qt中的事件处理(下)

    1. 事件的传递过程 (1)操作系统检测到用户动作时,会产生一条系统消息,该消息被发送到Qt应用程序 (2)Qt应用程序收到系统消息后,将其转化为一个对应的QEvent事件对象,并调用QObject: ...

随机推荐

  1. 粗略使用.NetCore2.0自带授权登陆Authorize

    上篇有朋友提及到如果nginx做集群后应该还会有下一篇文章主讲session控制,一般来说就是登陆:本篇分享的内容不是关于分布式session内容,而是netcore自带的授权Authorize,Au ...

  2. 迁移学习-Transfer Learning

    迁移学习两种类型: ConvNet as fixed feature extractor:利用在大数据集(如ImageNet)上预训练过的ConvNet(如AlexNet,VGGNet),移除最后几层 ...

  3. MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)

    简单来说,存储引擎就是指表的类型以及表在计算机上的存储方式. 存储引擎的概念是MySQL的特点,Oracle中没有专门的存储引擎的概念,Oracle有OLTP和OLAP模式的区分.不同的存储引擎决定了 ...

  4. github+hexo搭建自己的博客网站(四)主题之外的一些基本配置(统计配置,网站访问量显示)

    1.百度.谷歌统计配置 百度统计配置 申请账号:https://tongji.baidu.com/web/welcome/login 在代码获取的地方只要填入key即可 注册的时候,填的域名和url, ...

  5. pythonl练习

    练习:用户输入姓名.年龄.工作.爱好 ,然后打印成以下格式 ------------ info of Egon ----------- Name : Egon Age : 22 Sex : male ...

  6. JDK和Tomcat部署

    author:JevonWei 版权声明:原创作品 JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境.SDK是Soft ...

  7. 通过ssh协议实现用户key认证登录

    author:JevonWei 版权声明:原创作品 用户实现key认证登录 主机A 192.168.198,134 主机B 192.168.198,131 主机C 192.168.198,136 创建 ...

  8. 手机端rem适应

    这段时间做了几个手机版的项目,因为没有用框架,所以用rem来做适应,下面就分享一下 //第一种是比较简单的代码 (function(win) { resizeRoot(); function resi ...

  9. CSS基础知识摘要

    元素分类 块级元素 什么是块级元素?在html中<div>. <p>.<h1>.<form>.<table>.<ul> 和 &l ...

  10. GUI(GroupLayout 分组布局)

    组:一些组件的集合                       连续组:一个接着一个摆放                       并行组:一个组在另一个组的顶部                   ...