python - 当我在鼠标位置绘制一个椭圆时,它会正确绘制,但是当我移动它时,它会移动到窗口的角落

当我移动我的椭圆时,它会滑到窗口的左上角,或者在随机的地方,有时它会滑到 -ve 点。我不知道它为什么会移动,但同时它会被绘制在正确的鼠标位置。

我还尝试将它返回到 mouseReleaseEvent 中的鼠标位置,但它首先到达随机点然后返回到鼠标位置

class Draw(QMainWindow):
    base=[]
    molecular=[]
    
    def __init__(self):
        
        super().__init__()
        
        loadUi("drawnetwork.ui",self)
        self.scene=QGraphicsScene()
        self.scene.setSceneRect(126,0,652,379)
        
        self.gview.setScene(self.scene)
        self.gview.show()
    def mousePressEvent(self, event):
      
        if(x>127):
            if(self.drawbase.isChecked()):
               
                posx=event.pos().x()
                posy=event.pos().y()
                radius=20
                color=QBrush(Qt.green)
                myellipse=NodeEllipse(posx,posy,radius,color,"first")
                self.base.append(myellipse)
                self.scene.addItem(myellipse)
class NodeEllipse(QGraphicsEllipseItem):
    isPressed=False
    pozx=0
    pozy=0
    
   
    def __init__(self):
        pass
    def __init__(self,posx,posy,r,color,name):
        super().__init__(posx, posy, r, r)
       
       # self.setPos(posx,posy)
        self.pozx=posx
        self.pozy=posy
       
        self.setBrush(color)
        self.setAcceptHoverEvents(True)
        self.setFlag(self.ItemIsMovable)
        #self.setFlag(self.ItemSendsGeometryChanges)


    def mousePressEvent(self, event):
        print("i am pressed or not")
        print(self.isPressed)
        self.isPressed=True


    def mouseReleaseEvent(self, event):
        print("i am released")
        print('x: {0}, y: {1}'.format(self.pos().x(), self.pos().y()))    
        if(self.isPressed):
            self.setPos(event.pos().x(),event.pos().y())
           
            self.isPressed=False

回答1

我认为没有必要覆盖 mousePressEvent 和 mouseReleaseEvent 方法,您使用的位置也是相对于项目的,但 setPos 期望相对于场景的位置,这解释了不正确的位置:

class NodeEllipse(QGraphicsEllipseItem):
    def __init__(self, posx, posy, r, color, name):
        super().__init__(-r / 2, -r / 2, r, r)
        self.setBrush(color)
        self.setAcceptHoverEvents(True)
        self.setFlag(QGraphicsItem.ItemIsMovable)
        self.setPos(posx, posy)


class GraphicsScene(QGraphicsScene):
    def mousePressEvent(self, event):
        super().mousePressEvent(event)
        pos = event.scenePos()
        has_item = bool(self.itemAt(pos, QTransform()))
        if not has_item:
            radius = 20
            color = QBrush(Qt.green)
            myellipse = NodeEllipse(pos.x(), pos.y(), radius, color, "first")
            self.addItem(myellipse)
self.scene = GraphicsScene()
self.scene.setSceneRect(126, 0, 652, 379)
self.gview.setScene(self.scene)

相似文章

最新文章