2012-09-16 6 views
2

QPainterPath에서 개별 'lineTo'요소의 위치를 ​​편집 (또는 특정 요소를 제거하고 수정 된 버전으로 대체) 할 수있는 방법이 있습니까? * .setElementPositionAt (i, x, y)를 사용하지 않으려 고 시도했습니다 (경로가 다시 그려지지 않음).QPainterPath - 요소 이동/삭제

기본적으로 모든 사용자는 마우스로 동적으로 (qpainterpath 및 lineTo 방법론을 통해 생성 된) 폴리 라인의 정점을 편집해야합니다.

분명히 QGraphicscene에서 폴리 라인을 만드는 더 좋은 방법이 있다면 그것에 대한 조언도 환영 할 것입니다.

답변

3

나는 어떻게 setElementPositionAt을 사용하고 있는지 잘 모르지만 작동합니다. QGraphicsScene의 트릭은 addPathQGraphicsPathItem을 반환하고 setPath 메서드를 사용하여 수정 된 QPainterPath으로 해당 항목을 업데이트해야한다는 것입니다.

간단한 예를

:

import sys 
from PySide import QtGui 

class Widget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(Widget, self).__init__(parent) 

     self.view = QtGui.QGraphicsView() 
     self.scene = QtGui.QGraphicsScene() 
     self.scene.setSceneRect(0,0,100,100) 
     self.view.setScene(self.scene) 

     self.button = QtGui.QPushButton('Move path') 
     self.button.clicked.connect(self.movePath) 

     layout = QtGui.QHBoxLayout() 
     layout.addWidget(self.view) 
     layout.addWidget(self.button) 

     self.setLayout(layout) 

     self.createPath() 

    def createPath(self): 
     path = QtGui.QPainterPath() 

     path.moveTo(25, 25) 
     path.lineTo(25, 75) 
     path.lineTo(75, 75) 
     path.lineTo(75, 25) 
     path.lineTo(25, 25) 

     self.pathItem = self.scene.addPath(path) 

    def movePath(self): 
     # get the path 
     path = self.pathItem.path() 

     # change some elements 
     # element 0: moveTo(25, 25) 
     # element 1: lineTo(25, 75) 
     # element 2: lineTo(75, 75) 
     # ... 
     path.setElementPositionAt(2, 90, 85) 
     path.setElementPositionAt(3, 90, 15) 

     # set the new path 
     self.pathItem.setPath(path) 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 

    main = Widget() 
    main.show() 

    sys.exit(app.exec_()) 
+0

많은 많은 감사, 그건 정말 도움이되었다. QGraphicsPathItem을 사용하고 있었지만 어떤 이유로 addPath/setPath를 장면에 직접 적용했을 때 모든 것이 효과적이었습니다. 나는 또한 당신의 본보기 덕분에 다른 변화를 만들었습니다. 환상적. 다시 한번 감사드립니다. Avaris의 경우 –

+0

+1 그는 정확한 예를 보여 줄 시간을 얻습니다. 그것은 진정한 가치입니다. – Alex