C++学习(一六零)QQuickItem是如何显示到窗口的

本文介绍了QQuickWindow和QQuickItem在C++中的创建及渲染过程。从QQuickWindow的创建开始,讨论了QQuickItem如何加入场景图,并详细阐述了场景图的构建、绘制以及QQuickWindow如何根据场景图生成渲染列表并进行绘制。内容涉及OpenGL纹理的使用,以及QSGTexture和QSGMaterial在渲染过程中的作用。
摘要由CSDN通过智能技术生成

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

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值