博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Qt编程的艺术》——5.1 手动布局
阅读量:4982 次
发布时间:2019-06-12

本文共 1590 字,大约阅读时间需要 5 分钟。

在传统的GUI设计中,每个控件(Widget)都要手动地绑定在窗口之上的一个点上(也就是说,这个控件被指定成了给定GUI元素的父对象),同时还要指定这个控件的高度和宽度。作为所有图形元素的基础类,QWidget类提供了setGeometry()方法。这个方法需要4个整型参数:前两个参数指定相对于父控件(parent widget)的x、y坐标,后面两个参数指定控件的高度和宽度。在目前情况下,父控件的最终显示大小可能还未定。
 
作为一个例子,我们可以看一下一个继承自QWidget的窗口(如图5.1):
// manually/window.cpp#include 
#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,变长了不少。这样,除非有预先的解决方案,否则多余的部分只能被切掉了。
 
如果我们采用这种方案,最终,我们只能打补丁。要根本解决潜在的问题,我们不能避免使用自动布局。

 

转载于:https://www.cnblogs.com/pangblog/p/3268831.html

你可能感兴趣的文章
PHP的基本知识点
查看>>
企业IT管理员IE11升级指南【17】—— F12 开发者工具
查看>>
pager-taglib2.0中文传参乱码问题
查看>>
人生不可破的28个天规
查看>>
Protel文件转PADS文件
查看>>
C#中的变量声明
查看>>
iframe中跨域页面访问parent的方法
查看>>
curl实现多路并发请求(请求数量大时再次分割实现循环处理)
查看>>
调查问卷心得体会
查看>>
Linux文件3个时间点(access time,modify time,change time)
查看>>
深谈德国车和日本车的区别--觉得分析的还算冷静客观
查看>>
C#命名空间
查看>>
poj1655Multiplication Puzzle
查看>>
WinDebug 常用命令表【摘】
查看>>
LVS _keepalived 配置
查看>>
Django之ORM基础
查看>>
JS监听浏览器关闭事件
查看>>
[Log]ASP.NET之HttpModule 事件执行顺序
查看>>
明天回老家看我儿子了!
查看>>
hdu2089(数位dp模版)
查看>>