如何忽略GraphicsItem上的mousePressEvent(PyQt4)

2024-05-10 01:15:32 发布

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

     import sys 

from PyQt4 import QtGui,QtCore
x=-40
y=0
z=0
class MyView(QtGui.QGraphicsView):


    def __init__(self):
        QtGui.QGraphicsView.__init__(self)
        self.scene=QtGui.QGraphicsScene(self)
        self.item=[]
        self.item2=[]
        myLine=QtGui.QGraphicsLineItem(-10,20,20,20)
        myLine.setCursor(QtCore.Qt.CrossCursor)
        self.scene.addItem(myLine)
        myLine.setFlag(QtGui.QGraphicsItem.ItemIsMovable)

        self.setScene(self.scene)

    def keyPressEvent(self,event):
        global x
        global y
        global z
        if event.key()==QtCore.Qt.Key_Left:

            self.item.append(QtGui.QGraphicsRectItem(x,-10,40,40))
            self.scene.addItem(self.item[y])
            x=x+10
            self.item[y].setFlag(QtGui.QGraphicsItem.ItemIsMovable)
            y=y+1
        elif event.key()==QtCore.Qt.Key_Right:

            self.item2.append(QtGui.QGraphicsEllipseItem(x,-10,40,40))
            self.scene.addItem(self.item2[z])
            x=x+10
            self.item2[z].setFlag(QtGui.QGraphicsItem.ItemIsMovable)
            z=z+1
    def mousePressEvent(self , event):
        self._start=event.pos()
    def mouseReleaseEvent(self,event):
         start = QtCore.QPointF(self.mapToScene(self._start))
             end = QtCore.QPointF(self.mapToScene(event.pos()))
             self.scene.addItem(
                    QtGui.QGraphicsLineItem(QtCore.QLineF(start, end)))

if __name__=='__main__':
    app=QtGui.QApplication(sys.argv)
    view= MyView()
    view.show()
    sys.exit(app.exec_())

正如你所见,我不能移动矩形和椭圆,因为鼠标按下事件,它是画一条线

我想既能拖拉又能画一条线

当按在图形项上时,它应该以其他方式拖动它应该画线


Tags: selfeventdefsyssceneitemqtstart
1条回答
网友
1楼 · 发布于 2024-05-10 01:15:32

使用mousePressEvent()中的if itemAt(event.pos) is None:确定单击是否发生在QGraphicsItem上。在该方法中设置状态标志self.__dragging = the_item,以便可以在mouseMoveEvent()mouseReleaseEvent()中确定是拖动对象(self.__dragging is not None)还是绘制直线(self.__dragging is None)。你知道吗

相关问题 更多 >