2017-08-07 44 views
0

我已经在PyQt5中运行Qt scenegraph tutorial。好消息是,我正在承诺贝塞尔曲线。更好的是,当我调整窗口大小时,会添加新的贝塞尔曲线以匹配新的窗口大小。问题是旧的贝塞尔曲线仍然存在。如何让Qt只绘制最近的几何图形?在PyQt中更新Qt场景图

这是我从教程

def updatePaintNode(self, oldNode, _): 
    if not oldNode: 
     node = QSGGeometryNode() 
     geometry = QSGGeometry(QSGGeometry.defaultAttributes_Point2D(), 
           self._segment_count) 
     geometry.setLineWidth(2) 
     geometry.setDrawingMode(QSGGeometry.DrawLineStrip) 
     node.setGeometry(geometry) 
     node.setFlag(QSGNode.OwnsGeometry) 
     material = QSGFlatColorMaterial() 
     material.setColor(QColor(255, 0, 0)) 
     node.setMaterial(material) 
     node.setFlag(QSGNode.OwnsMaterial) 
    else: 
     node = oldNode 
     geometry = node.geometry() 
     geometry.allocate(self._segment_count) 

    vertices = geometry.vertexDataAsPoint2D() 

    for i in range(self._segment_count): 
     t = float(i)/(self._segment_count-1) 
     invt = 1-t 

     pos = invt * invt * invt * self._p1 \ 
       + 3 * invt * invt * t * self._p2 \ 
       + 3 * invt * t * t * self._p3 \ 
       + t * t * t * self._p4 \ 


     x = pos.x() * self.width() 
     y = pos.y() * self.height() 

     vertices[i].set(x, y) 

    node.markDirty(QSGNode.DirtyGeometry) 

    return node 
+1

难道你不检查 - 如果调整大小后'oldNode'为空? – folibis

+0

@folibis我在oldNode上检查null的唯一地方是上面的第二行。是否有一个单独的处理程序,我应该实施调整大小? – user640078

回答

0

我不知道这是最好的答案绘图代码的端口,但我偶然到周围的工作。我将几何节点作为更一般节点的子节点,似乎解决了这个问题。第一个条件现在看起来像:

if not oldNode: 
     node3 = QSGGeometryNode() 
     node = QSGNode() 
     node.appendChildNode(node3) 

     geometry = QSGGeometry(QSGGeometry.defaultAttributes_Point2D(), self._segment_count) 
     geometry.setLineWidth(2) 
     geometry.setDrawingMode(QSGGeometry.DrawLineStrip) 
     node3.setGeometry(geometry) 
     node3.setFlag(QSGNode.OwnsGeometry) 
     material = QSGFlatColorMaterial() 
     material.setColor(QColor(255, 0, 0)) 
     node3.setMaterial(material) 
     node3.setFlag(QSGNode.OwnsMaterial) 
    else: 
     node = oldNode 
     geometry = node.firstChild().geometry() 
     geometry.allocate(self._segment_count) 

由于我仍然不知道我在做什么或为什么这个工作,我不接受这个答案相当尚未。如果有人知道他们在做什么想要提供更好的答案,我很乐意接受它。但是,我还想记录我自己的解决方案,以防其他人遇到此问题。