在传统的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. xib和Storyboard 创建Cell的方式

    xib 方式 .在Cell.h文件中加一个宏 #define cellIdentifier @"customCell" . ViewController中: - (void)vie ...

  2. c++之 printf 打印内容

    该代码全部在Visual Studio 2015中编写,有关VS2015的安装流程后期在写相关的博文 首先让我们来输出一下hello, world! 1.首先新建一个main.cpp的文件,然后在该文 ...

  3. jquery于form正在使用submit问题,未解决

    $("#login_btn").click(function(){type为submit的button下 if($("#id_password").val(). ...

  4. LANMP 一键下载

    下载安装 wget http://dl.wdlinux.cn:5180/lanmp_v2.5.tar.gz tar zxvf lanmp_v2.5.tar.gz sh install.sh 4个可选安 ...

  5. Android--------Java接口回调

    >###回调说明 回调说明:         1.class A,class B         2.class A 实现接口callback         3.class B拥有一个参数为c ...

  6. UILabel自适应高度,自动换行

    CGRect rect; rect = self.labelInfo.frame; //UILabel高度自适应 rect.size.height = [self.labelInfo.text bou ...

  7. c#程序为PDF文件填写表单内容

    众所周知,PDF文件一般情况下是无法修改的,如果你有一张现成的PDF表格,这时想通过编程实现从数据库或者动态生成内容去填写这张表格,就会有些问题了,首先我们要解决以下2个重要的问题: 1.如何将内容写 ...

  8. WebBrowser中取对应的图片资源

    在客户端中使用webbrower控件,控件中已显示网页,对应的图片资源应已下载完,下面从缓存中找到图片资源,两种方法都可 1.GetUrlCacheEntryInfo http://msdn.micr ...

  9. 关于 jQuery中 function( window, undefined ) 写法的原因

    今天在读 jQuery 源码的时候,发现下面的写法: (function(window,undefined){ ...// code goes here })(window); window 作为参数 ...

  10. 15个顶级Java多线程面试题及回答

    Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程 的问题.在投资银行业务中多线程和并发 ...