2017-08-07 78 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) 

由於我仍然不知道我在做什麼或爲什麼這個工作,我不接受這個答案相當尚未。如果有人知道他們在做什麼想要提供更好的答案,我很樂意接受它。但是,我還想記錄我自己的解決方案,以防其他人遇到此問題。