• 7445阅读
  • 9回复

[讨论]布局疑难题 [复制链接]

上一主题 下一主题
离线moiit
 

只看楼主 倒序阅读 楼主  发表于: 2011-01-22
— 本帖被 XChinux 执行加亮操作(2011-01-22) —
一个朋友给出的题目:

现有一个QRect,800*600,要在里面挨个创建一堆子部件比如QLabel
从(0,0)开始按行摆放,摆满为止。

这些QLabel的hight一定,设为20,width等于text的长度,text限定最长10个字。
部件之间水平间隔20,垂直间隔20。

难点在于这些QLabel数量未知,其text也未知。
个人理解,实际上是求 setGeometry(x,y,w,h)的表达式。
其中变量很多,计有:int x, y, w, i(行数), j(列数), n(Qlabel的size), w=n*单个字宽。

如何实现?感觉变量太多,不太好搞。

恳请高手们一试,谢谢!


离线lejcey

只看该作者 1楼 发表于: 2011-01-22
既然长宽都限制了大小,这个还不好搞?QGridLayout就可以满足你的需求。10个字的长度不同的字体都不一样,你选一个试几次就可以确定宽度。

而且,QLabel既然数量未知,那么限定QRect的高度还有意义吗?少了摆不满,多了看不见。
离线moiit

只看该作者 2楼 发表于: 2011-01-22
引用第1楼lejcey于2011-01-22 16:01发表的 :
既然长宽都限制了大小,这个还不好搞?QGridLayout就可以满足你的需求。10个字的长度不同的字体都不一样,你选一个试几次就可以确定宽度。
而且,QLabel既然数量未知,那么限定QRect的高度还有意义吗?少了摆不满,多了看不见。

10个字是最长,不是每个都是10字。可能是一个字,也可能是8个字。也就是说,每行的部件数不一定相等。
如果每行每列都整整齐齐,那就没什么搞头了,呵呵。
QRect是要求一个布局的区域,在这个区域里头摆放部件。部件当然不能超出这个区域,否则那就不符合要求了。
仔细考虑的话,会有很多的变量。这才是难点。


[ 此帖被moiit在2011-01-22 16:41重新编辑 ]
离线XChinux

只看该作者 3楼 发表于: 2011-01-22
QFlowLayout,看看这个的实现。在assistant里能索引“Flow Layout Example”。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线moiit

只看该作者 4楼 发表于: 2011-01-22
引用第3楼XChinux于2011-01-22 16:34发表的 :
QFlowLayout,看看这个的实现。在assistant里能索引“Flow Layout Example”。

本题好像跟那个例子有些相似之处,但又有不同。
本题的变量似乎比那个例子要多,所以才有难度(对我来说)。
[ 此帖被moiit在2011-01-22 17:34重新编辑 ]
离线roywillow

只看该作者 5楼 发表于: 2011-01-22
先new出一大堆label到窗口上,这个时候应该就能获得每个label的宽度了
之后进行计算就好了,虽然计算起来也是有些费劲似乎
这个计算跟之前做的一个c的练习题有些像,给一段文本,限制每行字符数量,以及每行必须有完整的单词,进行换行之后在控制台输出
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线moiit

只看该作者 6楼 发表于: 2011-01-23
回 5楼(roywillow) 的帖子
问题是不能先new 这些label啊。
先得给出这些label的参数表达式,才能依照表达式去new吧。
离线roywillow

只看该作者 7楼 发表于: 2011-01-23
new label的时候应该只要提供string和parent就可以了吧
string应该是已经知道的吧,parent只要指定为窗口就可以了
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线XChinux

只看该作者 8楼 发表于: 2011-01-23
QFlowLayout的实现可供参考,它也是动态计算里面每个部件的尺寸的。尤其是要涉及到窗体大小变化的时候,每行部件自适应宽度等。光是文字的话,在QLabel中是能计算出各个部件所需要的宽度、高度的,所以肯定是能解决的。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线moiit

只看该作者 9楼 发表于: 2011-01-23
谢谢版主的关注。
FlowLayout应该是可以做到的,只是其实现方法似乎太复杂了。

快速回复
限100 字节
 
上一个 下一个