2013-12-18 51 views
4

我們已經發現,geometry->setLineWidth(3);在下面的代碼擴展到其它QML元件和可扭曲它們,即使這些其它QML元件是「正常」的QML元件(沒有QQuickItem子類的下方他們)。這對我來說似乎很奇怪,你可能會影響其他元素,我不知道它是否是一個錯誤?文檔說這個函數只應該影響當前元素,但那不是我的經驗。任何人都可以權衡爲什麼geometry->setLineWidth(3);有這麼笨重的權力?實施updatePaintNode導致其他QML元件也畫不正確

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);那麼問題就消失了。

+2

這實際上可以從https://bugreports.qt-project.org/secure/Dashboard.jspa獲得更快的(雙關語)答案! – mlvljr

回答

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元素是什麼類型?