Qt Quick的C++扩展类属性初始化顺序控制

我们用C++来写Quick扩展类的时候,有些部分其实是适合写成属性的,但是我们可能会担心这多个属性的初始化顺序是否合理。例如我们要写一个三维网格显示的扩展,那么这个扩展至少有两个属性:网格数据和纹理数据,分别是mesh和texture。要显示mesh,texture(或者是material)是必须的,如果仅仅做成两个属性,则无法确保texture的初始化在mesh之前。如果说我们在texture初始化之前就去显示网格,就需要提供一个默认的material,而且这个material在用户设置了他自己的material之后还要删掉。由于三维显示是很费事的操作,因此这种无谓的刷新应该要避免。

幸好Qt提供了相应的解决方案。Qt给出了一个类,或者严格讲是一个接口:QQmlParserStatus。自定义C++扩展除了继承自QObject之外,如果还继承自QQmlParserStatus的话,则可以使用它的两个重要函数:

void classBegin();

void componentComplete()

前者在该扩展类被初始化前调用,而后者在所有类属性、绑定等操作结束之后被调用。所以,回到一开始的问题,我们可以在componentComplete函数中再进行网格绘制,因为从文档中我们可以确信,在调用componentComplete的时候,Qt已经初始化好了所有类属性,也就是说mesh和texture都已经为我们准备好了。