在传统的GUI设计中,每个控件(Widget)都要手动地绑定在窗口之上的一个点上(也就是说,这个控件被指定成了给定GUI元素的父对象),同时还要指定这个控件的高度和宽度。作为所有图形元素的基础类,QWidget类提供了setGeometry()方法。这个方法需要4个整型参数:前两个参数指定相对于父控件(parent widget)的x、y坐标,后面两个参数指定控件的高度和宽度。在目前情况下,父控件的最终显示大小可能还未定。
 
作为一个例子,我们可以看一下一个继承自QWidget的窗口(如图5.1):

// manually/window.cpp
#include <QtGui>
#include "window.h"
Window::Window(QWidget *parent) : QWidget(parent)
{
setFixedSize(640,480);
QTextEdit *txt =new QTextEdit(this);
txt->setGeometry(20, 20, 600,400);
QPushButton *btn=new QPushButton(tr("&Close"),this);
btn->setGeometry(520,440,100, 20);
}

setFixedSize()方法指示窗口接收一个固定的再也不能改变的大小。之后,我们放置了一个编辑窗口(一个QTextEdit控件)和一个按钮。
 
从这些setGeometry()调用中可以明显地看出,要猜出这些控件的正确放置位置,是相当困难的。用这种方式建立布局,就是不停地选择候选数值、编译、然后调整数值,来增强显示效果,就是这样一种循环。如果控件(widget)或对话框(dialog)要做出调整的话,这种方式显得太笨拙了:举例说,如果你想在布局的中间位置添加一个新的按钮,所有放在它下面的元素的位置都要做出调整。
 
现在,也许有人会说,在实践中这不是问题,因为Qt Designer大力简化了上述位置调整的工作。但是我要说,任何GUI Designer都不能解决所有问题,除非采用自动布局。
 
无法解决的所有问题中的一个就是,当一个控件(widget)变大或缩小时,它要做出相应的变化:在一个不灵活的布局中且没有附加的帮助的情况下,这些元素——比如上例中的编辑窗口(editor window)——总是保持相同的大小。尽管它可能会根据屏幕大小做出一定适应,或者向用户提供选项,来选择其大小,但这仍然是个问题。
 
要让对话框的大小可以灵活调整,我们可以将setFixSize()调用换成resize()方法,这个方法也需要两个整型参数,或者一个QSize参数。这个方法只调整大小,却并不锁定它。用户现在可以通过鼠标改变对话框的大小,尽管窗口里的控件仍保持原来的位置、大小不变。
 
作为一种选择,你可以重新实现QWidget的resizeEvent()方法:当控件大小改变时,Qt总是调用这个方法。你可以编代码,在每次resizeEvent调用时,计算出窗口元素的新的大小和位置。但是在大多数情况下,这个步骤都太麻烦了,还需要手工计算控件(widget)的比例。
 
除此之外,重新实现resizeEvent()还会在国际化上遇到一个特别的问题:在地区化的软件上,一个标签控件(Label)的大小取决于它显示的语言。一个英语中叫Close的按钮,若按照德语来翻译,叫做Schließen,变长了不少。这样,除非有预先的解决方案,否则多余的部分只能被切掉了。
 
如果我们采用这种方案,最终,我们只能打补丁。要根本解决潜在的问题,我们不能避免使用自动布局。

《Qt编程的艺术》——5.1 手动布局的更多相关文章

  1. Qt 编程指南 3_1 按钮弹窗手动和自动关联示例

    触发的两种模式 connect() 和 on_控件ID_控件函数(参数) 两者优缺点对比: 虽然 Qt 有比较好用的自动关联大法,但自动关联不是万能的,尤其是涉及到多个窗体的时候,比如 A 窗体私有按 ...

  2. 《Qt编程的艺术》——9.1 QtSql模块的结构

    QtSql是一个独立的库,如果需要的话,它可以加载附加的插件.不同于QtCore和QtGui,它的内容默认情况下并没有整合进生成的project中.要使用这个库,我们要编辑 .pro文件,添加下列条目 ...

  3. 《Qt编程的艺术》——8.2.1 在Designer中使用View类

    不幸的是,QDirModel有一个严重的限制:因为view不响应鼠标操作,我们不得不自己建立这些功能.除此之外,每个view中,用户都一次只能选择一个元素.如果你想要允许同时选择多个项目,你也必须自己 ...

  4. 《Qt编程的艺术》——8.2 显示目录层次

    现在我们准备通过创建一个小程序来获得关于InterView的实践经验,使用QDirModel和拿来就用的view,来在四个不同的view中显示主目录,如图8.5所示.在代码里,除了例行公事先实例化一个 ...

  5. Qt之手动布局

    简述 手动布局,可以实现和水平布局.垂直布局.网格布局等相同的效果,也可实现属于自己的自定义布局,当窗体缩放时,控件可以随之变化. 其对于坐标系的建立有严格要求,纯代码思维,使用复杂,不易维护,所以一 ...

  6. 零基础学QT编程

    吴迪.2010.1 北京航空航天大学出版社   Qt资源 CSDN QT http://bbs.csdn.net/forums/Qt/ QT编程网 http://www.qtbcw.com/ 编程论坛 ...

  7. 73 QT编程入门

    0 引言 最近开始在QT下编程,记录一下遇到的问题以及解决方法. 1 安装下载及学习资料 (1)安装下载链接 安装链接: https://blog.csdn.net/qq_23473839/artic ...

  8. qt编程入门

    面对qt编程,必须先知道qt中常用的类: QPushButton按钮类.QLabel标签类.QMessageBox对话框类.QCheckBox.QAction.QMenu.QStatusBar.QTo ...

  9. Visual Studio下Qt编程中对中文的处理

    Visual Studio下Qt编程中对中文的处理 本文为原创文章,原文地址http://www.cnblogs.com/c4isr/p/qt_develop_in_vs.html Visual St ...

随机推荐

  1. Struts1——从BeanUtils看struts的实现原理2

        上一篇博客中我们简单的介绍了BeanUtils的使用.以及其最主要的原理,今天我们进一步的理解这个类在Struts1中的使用.     首先我们先回想一下搭建一个简单的基于Struts1框架的 ...

  2. [Git] --no-verify

    Somtimes, the project might set the commit message guide line, if your commit doesn't meet the requi ...

  3. [Immutable.js] Exploring Sequences and Range() in Immutable.js

    Understanding Immutable.js's Map() and List() structures will likely take you as far as you want to ...

  4. Codeforces 466 E. Information Graph

    并查集.... E. Information Graph time limit per test 1 second memory limit per test 512 megabytes input ...

  5. 3. QT窗体间值的传递(续)

    一.前言 上篇博客中通过重载子窗体的构造函数将主窗体的值传入到子窗体,但是在子窗体运行过程中如何才能将值动态的传入到子窗体?可以有两种办法,1.信号和槽的方式传值:2.主窗体中将传出值设置为publi ...

  6. 本博客弃用,请移步http://ningios.com查看最新

    本博客弃用,请移步http://ningios.com查看最新

  7. Android学习笔记—Windows下NDK开发简单示例

    该示例假设Android开发环境已经搭建完成,NDK也配置成功: 1.在Eclipse上新建Android工程,名称为ndkdemo.修改res\layout\activity_main.xml &l ...

  8. EffectiveC#18--用IComparable和IComparer实现对象的顺序关系

    1..Net框架提供了接口来描述对象的顺序关系:IComparable 和IComparer. 2.IComparable 为类定义了自然顺序,实现IComparer接口的类可以描述其它可选的顺序 3 ...

  9. HTML 表单与输出

    我们先来设置一个简单的表单 <!doctype html><html><head> <meta charset="utf-8"> & ...

  10. hbase权威指南学习笔记--架构--存储

    HBase主要处理两种文件:预写日志(Write-Ahead Log,WAL),实际的数据文件. 一个基本的流程是客户端首先联系ZooKeeper子集群查找行健数据所在的region服务器名.(通过Z ...