2016-09-27 15 views
1

path1.subtracted(path2)の仕組みを理解しようとしています。QPainterPaths、QPolygonを引く方法は?

  • 私はパス1とパス2持っている:image1

  • をそして私はpath3=path1.subtracted(path2)を使用してPATH3を取得しています。
    私はなぜ私が望む道を得ていないのですか?画像:image2

ここではコードです:私はQPolygonFで働いているこのサンプルで

from PyQt5.QtCore import QPointF 
from PyQt5.QtCore import QRectF, Qt 
from PyQt5.QtGui import QPainterPath, QPen 
from PyQt5.QtGui import QPolygonF 
from PyQt5.QtWidgets import QApplication, QGraphicsScene, \ 
    QGraphicsView, QPushButton, QWidget, \ 
    QVBoxLayout, QGraphicsItem, QGraphicsPathItem, QGraphicsRectItem 

class Window(QWidget): 
    scene = None 

    def __init__(self): 
     QWidget.__init__(self) 
     self.view = View(self) 
     self.button = QPushButton('Clear View', self) 
     self.button.clicked.connect(self.handleClearView) 
     layout = QVBoxLayout(self) 
     layout.addWidget(self.view) 
     layout.addWidget(self.button) 

    def handleClearView(self): 
     self.view.scene.clear() 


class View(QGraphicsView): 
    def __init__(self, parent): 

     self.scribing = False 
     self.erasing = False 
     QGraphicsView.__init__(self, parent) 
     self.scene = QGraphicsScene() 
     self.setScene(self.scene) 

    def resizeEvent(self, QResizeEvent): 
     self.setSceneRect(QRectF(self.viewport().rect())) 

    def mousePressEvent(self, event): 

     if event.buttons() == Qt.LeftButton: 
      self.scribing = True 

      self.path1 = QPainterPath() 
      self.path2 = QPainterPath() 

      self.polygon1 = QPolygonF() 
      self.polygon1.append(QPointF(100,100)) 
      self.polygon1.append(QPointF(100, 300)) 
      self.polygon1.append(QPointF(300, 300)) 
      self.polygon1.append(QPointF(300, 100)) 

      self.polygon2 = QPolygonF() 
      self.polygon2.append(QPointF(300,100)) 
      self.polygon2.append(QPointF(300, 300)) 
      self.polygon2.append(QPointF(100, 300)) 

      self.path1.addPolygon(self.polygon1) 
      self.path2.addPolygon(self.polygon2) 

      path3 = self.path1.subtracted(self.path2) 

      # self.scene.addPath(self.path1, QPen(Qt.blue)) 
      # self.scene.addPath(self.path2, QPen(Qt.green)) 
      self.scene.addPath(path3, QPen(Qt.red)) 


     if event.buttons() == Qt.RightButton: 
      self.erasing = True 


    def mouseMoveEvent(self, event): 

     if (event.buttons() & Qt.LeftButton) and self.scribing: 
      if self.free_draw_item: 
       pass 

     if event.buttons() & Qt.RightButton and self.erasing: 
      pass 

    def mouseReleaseEvent(self, event): 
     self.scribing = False 
     self.erasing = False 

     # if self.eraser_item != None: 
     #  self.scene.removeItem(self.eraser_item) 
     # if self.free_draw_item != None: 
     #  self.free_draw_item.setSelected(True) 


if __name__ == '__main__': 
    import sys 

    app = QApplication(sys.argv) 
    window = Window() 
    window.resize(640, 480) 
    window.show() 
    sys.exit(app.exec_()) 

。また、私はp1=QPainterPath()p2=QPainterPath()を作成し、p3を得るために減算を試みました。しかし、成功せずに、同じ結果を得る。

答えて

1

QpainterPath.subtracted()

see documentation

QpainterPath::operator-()が使用されている場合と同じ効果をパス要素が、パスの領域を減算しません:

 # path3 = self.path1.subtracted(self.path2) 
     path3 = self.path1 – self.path2 

あなたはこの

のようなもので、パスの要素を識別することができます
 c = path3.elementCount() 
     for i in range(c): 
      e = path3.elementAt(i) 
      print('Element-nr.: ', i, 'Type: ', e.type, 'x: ', e.x, 'y: ', e.y) # type: 0 = MoveTo, 1 = LineTo 

私は、あなたがelからpath3を作成する独自のメソッドを作成する必要があると思いますパス1とパス2のements。

関連する問題