我们今天来看看Layout/Children.h,这个类为啥要单独看看呢?是因为我们要了解SWihget 的话要首先知道它的layout的一些设置。而这个类可以比较好的看明白它的一些设计思想的。
这个Children.h里我们先看下FChildren,它是别的类的baseClass。
这个类很简单,代码是这样的:

首先我们看下 SLATECORE_API 它是一个定义,这个定义是为了能方便的把这个类的方法方便的导出DLL。
Num*() const =0 ; 是指什么呢?
它指的是这个函数是个abstract function 必须要在child calss 里实现它。我写了一个测试用例

当我们没有用B来继承A时,A是不能单独编译的会报“error: invalid new-expression of abstract class type 'A'”,指的是A 中的virtual方法没有被实现。关于pure virtual function with implementat的详细解读
那么现在我们在回过头来看 virtual int32 Num() const = 0; 就好解读多了,这是一个要子类实现的返回数量的函数。
后面 TSharedRef<SWidget> GetChildAt(int32 Index) = 0; TSharedRef 是unreal里的一个共享指针。而方法也很简单,就是获得指定位置对象的共享指针。
后面的FNoChildren 没什么好看的,我们来看看后面的 TWeakChild,这个一个为了临时加入Widget人UI而准备的,例如:Tooltips在显示的时候加入parentwidget,而在时间到了的时候就会移除。我们重点来看看里面的AttachWidget ,DetachWidget方法。

这两个方法是一对,一个是把引用相关联,一个是分离开关联。
再后面是两个layout相关的类TSupportsContentAlignmentMixin,TSupportsContentPaddingmixin.
它们的功能和它的名字一样,一个是存储横向和纵向对齐的组件,一个是存储padding的FMargin数据的类。

里面有一个要注意,private TIndirectArray<SlotType> 这是一个Indirect array ,也就是说TPanelChidren本身就是一个array,里面的方法没什么特别要看的,都是对array的一些操作。
TPanelChildrenConstIterator 顾名思义,是PanelChildren的迭代器,在初始化时要定义好是正向的(LeftToRight)还是逆向的(RightToLeft),剩下对 operator++ ,operator--,operator*,operator->重新定义了。
最后面是一个特殊的child ,叫 TOneDynamicChild,它可以看成是一个PanelChildren的委托,例如,我们有一个全局的PanelChildren,而我们要得到一个当前active的child,这个TOneDynamicChild就起到作用了。
整体看来,Children.h里定义了和widget相关的容器类,对它们进行了树状的层级管理。
网友评论