从QGraphicsScene中删除QGraphicsScene.group中的所有QGraphicsLineItem

时间:2015-03-29 18:44:56

标签: python qt pyqt qgraphicsscene

我正在尝试在QGraphicsPixmapItem上绘制矢量片段,我使用鼠标事件绘制第一个“红色虚线”来定位片段。释放鼠标时,将段顶点存储在列表中,然后将其附加到其他列表中。然后用绿色实线绘制包含所有段顶点的金属工艺者。 一旦用户完成绘制片段,我正在寻找一种方法从场景中删除片段并重新开始。

我无法找到清除场景的方法。 一个理想的方法是让每个段列出一个正确的segment.identifier,然后将“clear”按钮连接到self.scene.removeItem(segment.identifier)以删除它。

#!/usr/bin/env python
import sys
from PyQt4 import QtCore, QtGui

class MainWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.scene = QtGui.QGraphicsScene()
        self.view = QtGui.QGraphicsView(self.scene)
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.view)
        self.setLayout(layout)
        self.bt = QtGui.QPushButton("Clear lines")
        layout.addWidget(self.bt)
        self.pixmap_item = QtGui.QGraphicsPixmapItem(QtGui.QPixmap('image.png'), None, self.scene)
        self.pixmap_item.mousePressEvent = self.startLine
        self.pixmap_item.mouseMoveEvent = self.mouseMoveEvent
        self.pixmap_item.mouseReleaseEvent = self.updateProfile
        self.startPoint = QtCore.QPointF()
        self.profiles = []
        self.bt.clicked.connect(self.clean)
        self.pp = []


    def clean(self):
        #self.myItemGroup = self.scene.createItemGroup([])
        self.myItemGroup.hide
        print(dir(self.myItemGroup))

    def startLine(self, event):
        pen = QtGui.QPen(QtCore.Qt.red, 2, QtCore.Qt.DashDotLine)
        self.sline = QtGui.QGraphicsLineItem(QtCore.QLineF(0,0,0,0))
        self.sline.setPen(pen)
        self.scene.addItem(self.sline)
        print self.profiles
        if (QtCore.Qt.LeftButton):
            self.startPoint = QtCore.QPointF(event.pos())

    def updateProfile(self, event):
        self.profiles.append([self.startPoint.x(),self.startPoint.y(), event.pos().x(), event.pos().y()])
        #print self.profiles
        items = []
        pen = QtGui.QPen(QtCore.Qt.green, 2, QtCore.Qt.SolidLine)
        for i in self.profiles: 
            self.pline = QtGui.QGraphicsLineItem(QtCore.QLineF(i[0],i[1],i[2],i[3]))
            self.pline.setPen(pen)
            #self.scene.addItem(self.pline)
            #self.pline.setGroup(self.myItemGroup)
            items.append(self.pline)
        self.myItemGroup = self.scene.createItemGroup(items)
        self.lastPoint = self.startPoint
        self.startPoint = QtCore.QPointF(self.profiles[-1][-2],self.profiles[-1][-1])
        self.scene.removeItem(self.sline)
        print self.startPoint, self.lastPoint

    def mouseMoveEvent(self, event):
        self.sline.setLine(self.startPoint.x(),self.startPoint.y(), event.pos().x(), event.pos().y())


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    widget = MainWidget()
    widget.resize(640, 480)
    widget.show()
    sys.exit(app.exec_())

0 个答案:

没有答案