Qt 实现updatePaintNode会导致其他QML元素也无法正确绘制
我发现Qt 实现updatePaintNode会导致其他QML元素也无法正确绘制,qt,qml,qtquick2,Qt,Qml,Qtquick2,我发现geometry->setLineWidth(3)扩展到其他QML元素并可能使它们变形,即使这些其他QML元素是“正常”QML元素(它们下面没有QQuickItem子类)。这对我来说似乎很奇怪,你可能会影响其他元素,我想知道这是否是一个bug?文档中说这个函数应该只影响当前元素,但这不是我的经验。有人能解释一下为什么geometry->setLineWidth(3)有这么大的威力 QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintN
geometry->setLineWidth(3)下面代码中的code>扩展到其他QML元素并可能使它们变形,即使这些其他QML元素是“正常”QML元素(它们下面没有QQuickItem
子类)。这对我来说似乎很奇怪,你可能会影响其他元素,我想知道这是否是一个bug?文档中说这个函数应该只影响当前元素,但这不是我的经验。有人能解释一下为什么geometry->setLineWidth(3)代码>有这么大的威力
QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data){
QSGGeometry *geometry =
new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), 2);
geometry->setDrawingMode(GL_LINES);
geometry->setLineWidth(3);
geometry->vertexDataAsPoint2D()[0].set(0, 0);
geometry->vertexDataAsPoint2D()[1].set(width(), height());
QSGFlatColorMaterial *material = new QSGFlatColorMaterial;
material->setColor(QColor(255, 0, 0));
QSGGeometryNode *node = new QSGGeometryNode;
node->setGeometry(geometry);
node->setFlag(QSGNode::OwnsGeometry);
node->setMaterial(material);
node->setFlag(QSGNode::OwnsMaterial);
delete oldNode;
return node;
}
如果我省略了行geometry->setLineWidth(3)代码>然后问题就消失了。我认为这是一个bug,有点像。gsgbatchrender.cpp
中的实现如下所示:
if (g->drawingMode() == GL_LINE_STRIP || g->drawingMode() == GL_LINE_LOOP || g->drawingMode() == GL_LINES)
glLineWidth(g->lineWidth());
gl函数在当前OpenGL上下文中是全局函数,因此它们适用于所有绘图命令,并且没有任何函数将glLineWidth
设置回其以前的值。但是,也处于GL\u LINES
模式的任何其他节点也将在轮到它们进行渲染时设置线宽。因此,我猜测其他QML元素必须在不经过此代码和设置glLineWidth
自身的情况下渲染行。如果我是对的,那么这就是bug,其他元素需要显式设置宽度
您能告诉我们其他“正常”QML元素是什么类型的吗?这实际上可能会得到一个更快(双关语)的答案!