织梦CMS - 轻松建站从此开始!

罗索

QT 布局管理

jackyhwei 发布于 2010-06-22 14:02 点击:次 
狭义的说,QT的布局管理框架指的是以QLayoutItem/QLayout为基类的布局管理体系(应该说,对于QGraphicsSystem, 还有以QGraphicsLayoutItem/QGraphicsLayout为基类的一系列相关子类)
TAG:

狭义的说,QT的布局管理框架指的是以QLayoutItem/QLayout为基类的布局管理体系(应该说,对于QGraphicsSystem, 还有以QGraphicsLayoutItem/QGraphicsLayout为基类的一系列相关子类)

但是如果广义的说,布局就是管理控件的位置和尺寸的话,在QT中一共有三种方式

  • 绝对定位:在代码中调用QWidget::setGeometry()函数,对控件进行绝对定位
  • 手工定位:在resizeEvent等函数中,根据参数变化,撰写代码对控件进行定位
  • 使用布局管理器定位:使用QLayout类管理控件

布局 VS 控件

在GTK中,Layout和Widget并没有截然分开,不存在单独的Layout类,每个控件都要自己负责管理自己的子控件的布局,只不过有些控件管理的多些,或者基本上专门用来管理布局,而有些则管理的少一些。

而在QT中,Layout和Widget是相对独立的类,但是Layout本身单独存在并没有意义,需要和Widget配合使用。而Widget本身不负责子控件的布局管理。你可以认为,Layout类其实只是一组预先撰写好的代码,在父控件尺寸变化时,根据预设参数和子控件的各种Geometry hint,管理控件的位置和尺寸。

不过,也有一些例外,比如QMainWindow类,就自己管理预设的子控件的布局。

一点内部逻辑

**Layout如何管理Widget,层次关系**

  • 首先是要通过QWidget::setLayout函数,将一个QLayout类设置为控件的布局管理器。这一步实际也将这个控件设置为QLayout类的父控件。
  • 而后,通常通过QLayout::addWidget()等函数,将widget添加到Layout类的布局管理体系中

但是,Layout本身并不是Widget的父控件,因为QWidget类的父控件只能是QWidget类,所以Layout将其管理的子控件的父控件重定向为自己的父控件。

另外,因为QWidget类本身并不是一个QLayoutItem,而Qlayout的管理又是以QLayoutItem为单位。所以,在addWidget的操作中,QLayout还会创建一个QLayoutItem的子类QWidgetItem类来对应的包装代理添加进来的子控件。QWidgetItem对象最终会将QLayout布局管理体系中的布局参数信息装换、设置到它所代理的QWidget对象上


分组式(堆栈式)布局

QStackedLayout个人觉得叫分组布局有些歧义,还是直译堆栈布局比较合适。这个Layout类管理子控件的方式和其它QBoxLayout,QGridLayout等不太一样,比较特殊。QStackedLayout不侧重于子控件的位置管理,它所管理的子控件是叠加在一起的,主要控制哪个子控件位于最上层

可以通过设置参数,决定只有当前顶层控件可见(默认行为),还是所有子控件都可见(这样可以实现一些比如叠加显示的效果,当然,要最上层的控件有透明的区域)。

另外,不管堆叠参数如何设置,QStackedLayout的父控件的内容都是可见的,只要当前显示的子控件有透明区域。

作者:刘旭晖 Raymond 转载请注明出处 Email:colorant@163.com BLOG:http://blog.csdn.net/colorant/

(colorant)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201006/9692.html]
本文出处:CSDN博客 作者:colorant
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容