【问题标题】:Deleting an item from a scene从场景中删除项目
【发布时间】:2015-06-19 23:02:10
【问题描述】:

我目前在创建链接到 QGraphicsScene 类的删除按钮时遇到问题。该按钮是在 Window 类而不是 MyView 类中创建的。我试图让用户能够删除在场景中制作的标记,但现在它只删除我创建的最后一个椭圆项目,没有别的。弹出的错误通常表示您尝试删除的其他对象位于不同的场景中。此外,要删除的圆形对象的位置也很重要。因此,如果用户将光标悬停在特定圆圈上,则该圆圈项目应删除,仅此而已。这是我的代码:

import sys
from PyQt4 import QtGui, QtCore
#this sets the scene for drawing and the microscope image
class MyView(QtGui.QGraphicsView):
    def __init__(self,window):
        QtGui.QGraphicsView.__init__(self)
        self.window = window
        self.scene = QtGui.QGraphicsScene(self)
        self.item = QtGui.QGraphicsRectItem(400, 400, 400, 400)
        self.scene.addItem(self.item)
        self.setScene(self.scene)
    def paintMarkers(self,event):
        ##self.cursor = QtGui.QCursor()
        #self.cursor.setShape(2)
        p = self.mapToScene(event.x(),event.y())
        self.circleItem = QtGui.QGraphicsEllipseItem(p.x(),p.y(),5,5)
        self.scene.addItem(self.circleItem)
        self.circleItem.setPen(QtGui.QPen(QtCore.Qt.red, 1.5))
        #self.setScene(self.scene)
    def deleteMarkers(self):
        self.scene.removeItem(self.circleItem)
        #print "Hello world"
    #def mousePressEvent(self,QMouseEvent):
        #self.paintMarkers()
    def mousePressEvent(self,event):
        if self.window.btnPaintDot.isChecked():
            self.paintMarkers(event)
        if self.window.btnDeleteMarks.isChecked():
            self.deleteMarkers()
        return QtGui.QGraphicsView.mousePressEvent(self,event)




class Window(QtGui.QMainWindow):
        def __init__(self):
            #This initializes the main window or form
            super(Window,self).__init__()
            self.setGeometry(50,50,1000,1000)
            self.setWindowTitle("Pre-Alignment system")

            self.view = MyView()
            self.setCentralWidget(self.view)
    #makes deletemarks button checked when pressed
        def paintDeleteMarks(self):
            if self.btnDeleteMarks.isChecked():
                self.btnPaintDot.setChecked(False)
                self.btnPaintPolygon.setChecked(False)
                self.btnPaintPolygon.setChecked(False)
                self.btnDeleteMarks.setChecked(True)
            else:
                self.btnDeleteMarks.setChecked(False)

非常感谢,如果我的解释需要更多,请提出问题......很好解释。

【问题讨论】:

    标签: python mouseevent pyqt4 qgraphicsscene


    【解决方案1】:

    如果您仔细阅读您的代码,您会发现您正在删除存储在self.circleItem 中的项目。存储在该变量中的项目总是只是最后一个创建的(每次创建新项目时都会覆盖该变量)。

    您需要修改您的代码,以便它根据鼠标事件的当前 x-y 坐标查找项目。使用 QGraphicsScene.itemAt() 在特定 x-y 坐标处查找项目(请记住在查找该位置的项目之前正确转换相对于场景的坐标)。

    【讨论】:

    • 我必须使用 mapToScene() 方法对吗?几天前你告诉我的问题是为了找到正确的位置?
    【解决方案2】:

    感谢three_pineapples,这是解决问题的代码!

        import sys
    from PyQt4 import QtGui, QtCore
    #this sets the scene for drawing and the microscope image
    class MyView(QtGui.QGraphicsView):
        def __init__(self,window):
            QtGui.QGraphicsView.__init__(self)
            self.window = window
            self.scene = QtGui.QGraphicsScene(self)
            self.item = QtGui.QGraphicsRectItem(400, 400, 400, 400)
            self.scene.addItem(self.item)
            self.setScene(self.scene)
        def paintMarkers(self,event):
            ##self.cursor = QtGui.QCursor()
            #self.cursor.setShape(2)
            p = self.mapToScene(event.x(),event.y())
            if (p.x() > 400 and p.x() < 800) and (p.y() > 400 and p.y() < 800):
                self.circleItem = QtGui.QGraphicsEllipseItem(p.x(),p.y(),5,5)
            self.scene.addItem(self.circleItem)
            self.circleItem.setPen(QtGui.QPen(QtCore.Qt.red, 1.5))
            #self.setScene(self.scene)
        def deleteMarkers(self,event):
            p = self.mapToScene(event.x(),event.y())
            if self.scene.itemAt(p.x(),p.y()) != self.item:
                self.scene.removeItem(self.scene.itemAt(p.x(),p.y()))
            #print "Hello world"
        #def mousePressEvent(self,QMouseEvent):
            #self.paintMarkers()
        def mousePressEvent(self,event):
            if self.window.btnPaintDot.isChecked():
                self.paintMarkers(event)
            if self.window.btnDeleteMarks.isChecked():
                self.deleteMarkers(event)
            return QtGui.QGraphicsView.mousePressEvent(self,event)
    

    【讨论】:

      猜你喜欢
      • 2015-12-22
      • 2013-08-23
      • 2015-04-28
      • 2023-03-12
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 2015-01-08
      相关资源
      最近更新 更多