私はpyqt5を使って簡単なペイントアプリケーションに取り組んでいます。私の目標は:なぜpath.subtracted(path2)がパスをリンクしていますか?どのように私はdelinkingできますか?
です。マウスイベントに従って自由に描画します。完了しました!
。マウスイベントに従って自由に消去します。それは期待どおりの仕事ではありません!
私はQGraphicsView、QGraphicsSceneを持っています。私はQGraphicsItems、特にQGraphicsPathItemを追加しています。私の消しゴムは矩形をしていますが、私が望むのは、消しゴムを動かしながら私の作図の一部を消すことです。
MouseMoveEventで、私の消しゴムの形状が私の描画パスと交差しているかどうかを確認します。もしそうなら、描画パスから消してしまいます。そして、不自然な動作が起こり、私の描画パスが閉じます。
図1は、私の図(QGraphicsPathItem)を示しています。 図2は、私の消しゴム(QGraphicsRectItem)が私の図面と交差するときの状況を示しています。
Drawing freely lines working fine. Figure_1
私たちが見ることができるように、それは私の道を閉じて、私の最初と最後の点を結ぶ線を描画します。私はそれを望んでいない。私は自分の描画パスを消したいだけです。
from PyQt5.QtCore import QRectF, Qt
from PyQt5.QtGui import QPainterPath, QPen
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)
self.free_draw_item = None
self.eraser_item = None
def resizeEvent(self, QResizeEvent):
self.setSceneRect(QRectF(self.viewport().rect()))
def mousePressEvent(self, event):
if event.buttons() == Qt.LeftButton:
self.scribing = True
pp = QPainterPath(event.pos())
self.free_draw_item = QGraphicsPathItem(pp)
self.free_draw_item.setPen(QPen(Qt.green))
self.free_draw_item.setFlags(QGraphicsItem.ItemIsSelectable)
self.free_draw_item.setPath(pp)
self.scene.addItem(self.free_draw_item)
if event.buttons() == Qt.RightButton:
self.erasing = True
self.eraser_item = QGraphicsRectItem(event.pos().x() - 5,
event.pos().y() - 5, 10, 10)
self.eraser_item.setPen(QPen(Qt.red))
self.eraser_item.setBrush(Qt.transparent)
self.scene.addItem(self.eraser_item)
def mouseMoveEvent(self, event):
if (event.buttons() & Qt.LeftButton) and self.scribing:
if self.free_draw_item:
path = self.free_draw_item.path()
path.lineTo(event.pos())
self.free_draw_item.setPath(path)
if event.buttons() & Qt.RightButton and self.erasing:
self.eraser_item.setRect(event.pos().x() - 5, event.pos().y() - 5,
10, 10)
for item in self.scene.collidingItems(self.eraser_item):
if isinstance(item, QGraphicsPathItem):
if item.path().intersected(self.eraser_item.shape()):
new = item.path().subtracted(self.eraser_item.shape())
item.setPath(new)
#item.setBrush(Qt.red)
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_())
これは私のコードです。
マウスの左ボタンは、シーンに緑色のパスを描画します。
マウスの右ボタンで図面を消去します。
箱の外に何もありません。あなたはあなたのパスをサブパスとして保持し、サブパスを変更するときにそれを再作成する必要があります。 – dtech