新建一个类,继承QQuickItem,重写​updatePaintNode()​并设置 ​QQuickItem::ItemHasContents​来添加到场景

rec::rec(QQuickItem *parent)
: QQuickItem(parent)
{
setFlag(ItemHasContents, true);
//不设置就不会被渲染
}

SceneGraph由各种类型的节点类型构成,一个节点可以有任意数量的子节点。

​QSGClipNode​

实现剪切

​QSGGeometryNode​

实现可视化内容

​QSGNode​

Node的基类

​QSGOpacityNode​

不透明度

​QSGTransformNode​

实现变换/转换

重写​​updatePaintNode()​

QSGNode *Graph::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)

Scene Graph中可视对象就是QSGNode​,render在运行时会把这些Node插入一个树,在需要更新界面时候会重新渲染,渲染就会进入updatePaintNode()会传入一个QSGNode指针

在界面参数改变时就是更新的时候,在函数中使用update(),进行一次渲染。

我们要在Node上继续操作就需要用到类型转换

GraphNode *n= static_cast<GraphNode *>(oldNode);

这里的GraphNode是继承自QSGNode的一个自定义类

QSGNode *rec::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)
{
QSGSimpleRectNode * root = static_cast<QSGSimpleRectNode *>(oldNode);
if (!root)
root = new QSGSimpleRectNode(boundingRect(), QColor(255,0,0));
else {
root->setRect(boundingRect());
root->setColor(QColor(255,0,0));
}
return root;
}

updatePaintNode()用来完成一次界面渲染。在类中使用update()触发界面更新,但不是立即触发,会在下一次节点更新时触发。

QSGSimpleRectNode本身也是继承自QSGNode的,一个完整的Node需要Material和Geometry。

setRect内部已经设置了Geometry,setColor设置了Material。

boundingRect()返回QRectF,相当于写QRectF(0, 0,width(),height())
诸如boundingRect(),width(),height(),window(),这样的都是属于qquickitem的属性,来自你在qml中使用该时的定义

首先在C++中使用   qmlRegisterType<rec>("rec", 1, 0, "rec");

//qml
rec
{
width: 200
height: 200
}

如此就可以得到一个矩形

Qt Scene Graph之创建一个矩形_QSG