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. GridView用法详解

    前台页面: Default.aspx <%@ Page Language="C#" AutoEventWireup="true" CodeFile=&qu ...

  2. TOMCAT闪退。cmd执行startup.bat保错:the CATALINA_HOME environment variable is not defined correctly

    从上图可以看出 是我们没有设置CATALINA_HOME变量 于是我设置了这个变量之后 ,再次重启,ok了

  3. robot framework 牛刀一试

    1.New Project   Type选择Directory,Format选择TXT 2.New Suite   在Project的基础上Create New Suite,Type选择File,Fo ...

  4. 消息摘要技术(MD5)

    1.使用消息摘要技术对密码加密 数据库存储的是经过消息摘要技术加密之后的信息, 避免保存密码明文,提升了系统安全性 必要性说明: 如果存储明文密码,数据库系统管理员和攻破系统的黑客是可以拿到你的所有信 ...

  5. JAVA实用案例之邮件发送

    最近有朋友问邮件怎么发送,就简单写了个demo,因为懒得找jar包,所以项目是创建的maven工程,具体的maven引用的jar如下: <dependency> <groupId&g ...

  6. MySQL(十一)之触发器

    上一篇介绍的是比较简单的视图,其实用起来是相对比较简单的,以后有什么更多的关于视图的用法,到时候在自己补充.接下来让我们一起了解一下触发器的使用! 一.触发器概述 1.1.什么是触发器 触发器(Tri ...

  7. ehcache memcache redis 三大缓存对比

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt268 最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今 ...

  8. Windows环境下最新OpenCV和Contribute代码的联合编译

    解决这个问题,目的在于获得并使用最新的完全版本的代码,主要方法是对CMake能够熟练使用,并且对编译等基础支持有所了解. 一.工具的准备 1 tortoisegit www.tortoisegit.o ...

  9. html标签缺省(自带)样式大全

    html标签默认样式整理 作者:佚名  来源:互联网 时间:07-30 16:54:48 文为大家整理了html标签默认样式属性及浏览器默认样式等等,喜欢css布局的朋友们可以学下,希望对大家有所帮助 ...

  10. Windows10 VS2015下分别编译libevent 32位和64位库

    Libevnt 在Windows10 VS2015下分别编译32位和64位库 直接上王道 libevent代码地址: https://github.com/libevent/libevent git ...