在传统的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. Android进程间通信(IPC)机制Binder简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6618363 在Android系统中,每一个应用 ...

  2. kaggle之人脸特征识别

    Facial_Keypoints_Detection github code facial-keypoints-detection, 这是一个人脸识别任务,任务是识别人脸图片中的眼睛.鼻子.嘴的位置. ...

  3. SQLLoader3(数据文件没有分隔符时的导入)

    数据文件:D:\oracletest\ldr_tab_fiile.dat1.数据文件字段中间以制表符TAB隔开:7369 SMITH CLERK7499 ALLEN SALESMAN7521 WARD ...

  4. [Python笔记][第四章Python正则表达式]

    2016/1/28学习内容 第四章 Python字符串与正则表达式之正则表达式 正则表达式是字符串处理的有力工具和技术,正则表达式使用预定义的特定模式去匹配一类具有共同特征的字符串,主要用于字符串处理 ...

  5. linux用户创建删除以及文件权限查看修改

    一. 1.查看用户 命令如下:whoami 2.创建用户 创建用户命令:sudo adduser hello 超级用户是 root 删除用户名命令:sudo deluser hello --remov ...

  6. photoshop动作面板批量处理图片边框技巧

    1,想给图片加上边框,在不改变图片大小的前提下,可以这样做:ctrl+a,全选图片,然后“编辑”-----“描边”,在跳出来的选项卡里面可以设置边框颜色,大小,位置,及混合模式, ,我们设置好了,就可 ...

  7. MySQL的字符串函数截取字符

    函数: 1.从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 例:select left(content,200) as abstract from my ...

  8. 一些不熟悉的SQL脚本--约束条件

    1.根据表名查询主键的SQL语句 SELECT D.COLUMN_NAME AS COLNAME FROM USER_CONS_COLUMNS D, USER_CONSTRAINTS M WHERE ...

  9. weblogic开机启动脚本

    1.在/home/bea/startBeaAll目录内创建一个startBeaAll.sh文件,加入如下内容(把相应目录与命令修改即可,红字部分为修改地方): #!/bin/sh echo " ...

  10. C#如何解决对ListView控件更新以及更新时界面闪烁问题

    第一个问题:如何更新ListView控件内容 很多时候运行窗体程序时,由于程序中使用了多线程加之操作不当,所以在对控件操作时会出现下面这样的异常:   这是因为我们在窗体中添加的控件都有属于自己的线程 ...