本文不是想分析Qt源码的具体代码,一个是本人能力还没达到那个地步,而且着实没时间认真研究QT(因为你懂的Android。。。),由于项目需要所以稍微了解了下QT的view体系。大概的将我了解到的要点罗列一下,这样子如果需要研究源码的时候就有方向(其实我也是怕自己忘记)。
QT的paint的过程是依赖事件驱动的。在需要渲染时触发QEvent::Paint事件。然后QObject及其继承类比如特别得QWidget中捕获这个事件,调用QWidget及其继承类的paintEvent()方法。然后其中调用QStyle的方法绘制具体的比如直线,pixmap等。Qstyle对于不同的机器比如window,Linux有不同的实现。在QStyle中调用QPaint的方法实现最后的绘制。恩可以看到这个跟Android的draw就很像了。
以QLabel为例调用过程:
对于QT中layout的实现,可以看到他的基类是QLayout,其他的Layout比如GrideLayout继承于QLayout。在GrideLayout中最重要的函数是:setGeometry(),他的功能有点类似Android中的layout()。
QQuickGrid,QQuickRow,QQuickFlow,QQucikColumn都继承自QQuickBasePositioner。在QQuickBasePositioner的prePositioning()中遍历View的所有子View,并调用子类实现的doPositioning(&contentSize)方法实现具体的布局。