当我在鼠标位置上绘制椭圆时,它会被正确绘制,但当我移动它时,它会移动到窗口的角落



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

我还试图将其返回到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

我认为没有必要重写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)

最新更新