Реализация updatePaintNode приводит к тому, что другие элементы QML также отображаются некорректно.

Я обнаружил, что 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);, проблема исчезнет.


person johnbakers    schedule 18.12.2013    source источник
comment
На самом деле это может получить гораздо более быстрый (каламбур) ответ от bugreports.qt-project.org/ secure / Dashboard.jspa!   -  person mlvljr    schedule 23.12.2013


Ответы (1)


Я думаю, что это какая-то ошибка. Реализация в 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?

person Chris Dolan    schedule 11.08.2015