gpt4 book ai didi

qt - 实现 updatePaintNode 会导致其他 QML 元素也无法正确绘制

转载 作者:行者123 更新时间:2023-12-02 14:25:28 27 4
gpt4 key购买 nike

我发现下面代码中的 geometry->setLineWidth(3); 扩展到其他 QML 元素并可能扭曲它们,即使这些其他 QML 元素是“正常”QML 元素(带有它们下面没有 QQuickItem 子类)。这对我来说似乎很奇怪,你可能会影响其他元素,我想知道这是否是一个错误?文档说这个函数应该只影响当前元素,但这不是我的经验。任何人都可以权衡一下为什么 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); 行,那么问题就会消失。

最佳答案

我认为这是一个错误。 gsgbatchrenderer.cpp 中的实现如下所示:

if (g->drawingMode() == GL_LINE_STRIP || g->drawingMode() == GL_LINE_LOOP || g->drawingMode() == GL_LINES)
glLineWidth(g->lineWidth());

gl 函数在当前 OpenGL 上下文中是全局的,因此它们适用于所有绘图命令,并且没有任何东西可以将 glLineWidth 设置回其先前的值。但是,任何其他也处于 GL_LINES 模式的节点在轮到渲染时也会设置线宽。所以我猜测其他 QML 元素必须渲染线条,而无需执行此代码并自行设置 glLineWidth 。如果我是对的,那么这就是错误,其他元素需要显式设置宽度。

您能告诉我们其他“正常”QML 元素是什么类型吗?

关于qt - 实现 updatePaintNode 会导致其他 QML 元素也无法正确绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20655061/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com