一、谈谈QPainter
如果能良好的使用QPainter,那Qt已经入门一半了。QPainter如此神奇,好比神笔马良的画笔,能够实现你能看到的所有2D控件。无论是搭配QWidget, 还是搭配QGraphicsItem, 甚至搭配QQuickItem,都能实现你想要的控件。
二、说说QPainter在QQuickItem中实现的原理
- 首先要使用QPainter,那么QQuickPaintedItem必不可少。继承自QQuickItem
- QQuickItem,是依赖QSG框架实现的,通过QSGNode *QQuickPaintedItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data)刷新对应的节点
- 在 updatePaintNode函数创建 节点函数如下
- QSGPainterNode *node = static_cast<QSGPainterNode *>(oldNode);
if (!node) {
node = d->sceneGraphContext()->createPainterNode(this);
d->node = node;
} - 通过sceneGraphContext()->createPainterNode(this);创建的节点实际上是QSGDefaultPainterNode,并且把this参数传进去,进行注册。
- QSGDefaultPainterNode的paint函数,里会调用QQuickPaintedItem的paint函数。绘制到QImage中,当纹理使用
- 这样我们通过实现QQuickPaintedItem 的虚函数paint,使用QPainter,如同在QWidget中绘制一样方便。