在Qt中,通过setParent给一个QWidget添加一个孩子是一项耗时的操作,包括触发ChildAdded、parentChanged事件、
解析字体和调色板、处理布局方向和本地化、同步Enable状态、继承样式、应用样式、传播样式、根据绘制层递归设置重绘区等。了解这里面的实现细节可以让我们更全面地了解掌握Qt。另外,还能发现一些对性能友好的用法。
例如,往已经显示的QWidget添加控件时,可以考虑创建完后添加到界面树中,相比自顶向下依次创建,大概能提高10%~20%的性能
//A方法:(建议):
QWidget * parent= new QWidget();
QWidget * toBeAddedA = new QWidget(parent);
QWidget * toBeAddedB = new QWidget(parent);
parent->setParent(alreadShowWidget);//最后添加到界面树中
//B方法:(不建议):
QWidget * parent= new QWidget(alreadShowWidget);
QWidget * toBeAddedA = new QWidget(parent);
QWidget * toBeAddedB = new QWidget(parent);
当然,对于简单界面的创建,不必过度强制推行这种形式,更不建议过早优化,因为这种方式带来的提升是有限的,这里创造的价值不值得我们为此推行一个新的规则。而对于复杂界面的创建,则可以参考这里的建议;或后续采用.ui文件的LoadUI形式,也可以获得较好的性能表现。
在研究这里的创建细节时,我们发现我们的创建性能仍有很大的优化空间。由于目前的样式表过于复杂,导致在添加Widget时解析样式耗时过长,这块平台正计划进行系统性的性能优化。这部分优化后将能大大提高整体界面创建的速度。