Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 实现updatePaintNode会导致其他QML元素也无法正确绘制_Qt_Qml_Qtquick2 - Fatal编程技术网

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)扩展到其他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元素是什么类型的吗?

这实际上可能会得到一个更快(双关语)的答案!