LayoutManager
ctkLayoutManager、ctkLayoutViewFactory 和 ctkLayoutFactory 类分析
1. ctkLayoutManager
功能:
- 这是一个抽象基类,用于根据XML文档动态创建和管理Qt布局
- 负责解析XML布局描述,并将其转换为实际的Qt布局和窗口部件
- 支持多种布局类型:垂直(vertical)、水平(horizontal)、网格(grid)和标签页(tab)布局
- 支持布局分割、拉伸因子、多视口等高级特性
核心特性:
- 可以设置多个视口(viewport),每个视口可以显示不同的布局
- 提供布局刷新、间距设置等功能
- 定义了抽象方法
viewFromXML()
,派生类必须实现此方法来创建具体的视图窗口部件
2. ctkLayoutViewFactory
功能:
- 这是一个抽象工厂类,负责从XML元素创建和设置具体的视图窗口部件
- 提供了视图创建的标准化接口
- 支持视图缓存机制,可以重用之前创建的视图
核心特性:
- 定义了
viewFromXML()
方法,用于从XML元素创建视图 - 支持自定义元素名称(不仅限于"view"标签)
- 提供布局设置前后的钩子方法:
beginSetupLayout()
和endSetupLayout()
- 包含
setupView()
方法,用于在视图显示到布局中时进行额外设置
3. ctkLayoutFactory
功能:
- 继承自
ctkLayoutManager
,实现了其抽象方法 - 提供了注册多个视图工厂的机制,实现了视图创建的可扩展性
- 使用工厂模式,根据XML元素类型选择合适的视图工厂
核心特性:
- 可以注册/注销多个
ctkLayoutViewFactory
实例 - 维护视图与创建它们的工厂之间的映射关系
- 重写了
viewFromXML()
方法,从注册的工厂中选择合适的一个来创建视图 - 在布局设置过程中协调所有注册的视图工厂
类之间的关系
-
继承关系:
ctkLayoutFactory
继承自ctkLayoutManager
- 这形成了一个类层次结构,其中
ctkLayoutManager
定义了基本接口,ctkLayoutFactory
提供了具体实现
-
组合关系:
ctkLayoutFactory
包含多个ctkLayoutViewFactory
实例- 这种组合允许
ctkLayoutFactory
委托视图创建的具体工作给不同的专业工厂
-
调用流程:
- 当设置布局时,
ctkLayoutFactory
会首先调用所有注册工厂的beginSetupLayout()
- 然后调用父类
ctkLayoutManager
的setupLayout()
方法解析XML - 在解析过程中,对于每个视图元素,
ctkLayoutFactory
会查找支持该元素的工厂并调用其viewFromXML()
方法 - 视图创建后,使用对应的工厂调用
setupView()
方法进行设置 - 最后调用所有工厂的
endSetupLayout()
方法完成布局设置
- 当设置布局时,
设计模式应用
- 抽象工厂模式:
ctkLayoutViewFactory
作为抽象工厂,定义了创建视图的接口 - 工厂方法模式:
viewFromXML()
作为工厂方法,由具体工厂实现 - 组合模式:XML布局结构采用组合模式,将布局和项目统一处理
- 装饰器模式:通过XML属性扩展布局和视图的功能
这种设计使得CTK布局系统具有高度的灵活性和可扩展性,可以轻松支持不同类型的视图和复杂的布局配置。