删除中的所有QGraphicsLineItemqgraphicscene.group从qgraphicscen

2024-05-08 09:01:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在QGraphicsPixmapItem上绘制向量段,我使用鼠标事件绘制第一条“红色虚线”来定位线段。当鼠标松开时,线段顶点存储在一个列表中,然后附加到另一个列表中。然后使用绿色实线绘制包含所有线段顶点的metalist。 一旦用户完成绘制分段,我正在寻找一种方法,从场景中删除分段并重新开始。在

我找不到一个方法来清理场景删除片段。 一个理想的方法是将每一个部分列出一个适当的段标识符然后将“清除”按钮连接到self.scene.removeItem(段标识符)移除它。在

#!/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_())

Tags: posselfeventdef绘制sceneqtprofiles