Qt Scene Graph之创建一个矩形
原创
©著作权归作者所有:来自51CTO博客作者邪恶海星星的原创作品,请联系作者获取转载授权,否则将追究法律责任
新建一个类,继承QQuickItem,重写updatePaintNode()
并设置 QQuickItem::ItemHasContents
来添加到场景
rec::rec(QQuickItem *parent)
: QQuickItem(parent)
{
setFlag(ItemHasContents, true);
//不设置就不会被渲染
}
SceneGraph由各种类型的节点类型构成,一个节点可以有任意数量的子节点。
重写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
}
如此就可以得到一个矩形