1、QQuickWindow的创建
2、qquickitem的创建
(1)QQuickWindow下的QQuickItem的创建
(2)qml文件中的QQuickItem的创建
将创建好的QQuickItem放入QQuickWindow的脏对象列表(dirtyItemList)
qtdeclarative\src\quick\items\qquickitem.cpp
void QQuickItemPrivate::addToDirtyList()
{
if (!prevDirtyItem) {
QQuickWindowPrivate *p = QQuickWindowPrivate::get(window);
nextDirtyItem = p->dirtyItemList;
if (nextDirtyItem) QQuickItemPrivate::get(nextDirtyItem)->prevDirtyItem = &nextDirtyItem;
prevDirtyItem = &p->dirtyItemList;
p->dirtyItemList = q;
p->dirtyItem(q);
}
}
3、qquickitem准备好场景图。
参看C++学习(一六八)qt如何构建场景树
qtdeclarative\src\quick\items\qquickwindow.cpp
void QQuickWindowPrivate::updateDirtyNodes()
{
qCDebug(DBG_DIRTY) << "QQuickWindowPrivate::updateDirtyNodes():";
cleanupNodes();
QQuickItem *updateList = dirtyItemList;
dirtyItemList = nullptr;
if (updateList) QQuickItemPrivate::get(updateList)->prevDirtyItem = &updateList;
while (updateList) {
QQuickItem *item = updateList;
QQuickItemPrivate *itemPriv = QQuickItemPrivate::get(item);
itemPriv->removeFromDirtyList();
qCDebug(DBG_DIRTY) << " QSGNode:" << item << qPrintable(itemPriv->dirtyToString());
updateDirtyNode(item);
}
}
一个场景图实例
QuickWindow->QSGRootNode 218
QuickWindow->QQuickItem->QSGTransformNode 5b8
QQuickFrameBufferObject->QSGTransformNode 918
QQuickFrameBufferObject->QSGFramebufferObjectNode 3f8
4、绘制场景图
渲染器是场景图的自包含部分,它遍历QSGNode树,并使用QSG