在pyqt种,可以不去手动执行动作,而是通过代码执行一些我完全没执行过的鼠标动作。
关键是QMouseEvent这个类,这是鼠标动作类,包含描述鼠标事件的参数,用于描述鼠标事件。
先定义一个鼠标事件
releaseEvent = QMouseEvent(QEvent.MouseButtonRelease,event.localPos(),event.screenPos(),
Qt.LeftButton,Qt.NoButton,event.modifiers())
QMouseEvent的初始化
初始化方法有4种, 我主要用的是这两种
第一种
成员函数描述:
QMouseEvent::QMouseEvent ( Type type, const QPoint & position, Qt::MouseButton button,
Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers )
参数type必须是QEvent::MouseButtonPress,QEvent::MouseButtonRelease,QEvent::MouseButtonDblClick, or QEvent::MouseMove其中的一个。
参数position是鼠标指针相对于窗口的位置,
参数button作为鼠标事件所代表的值可以从QT::MouseButton的枚举列表中查找。如果参数type是一次MouseMove事件,那么相对应的button取值就该为QT::NoButton.
在一次QT事件过程中,鼠标和键盘的状态位可以通过参数buttons和modifiers指定。
buttons和button都是在QT::MouseButton的枚举列表中查找,基本上buttons和button的值一样。
通过globalPos()的返回值来初始化QCursor::pos()有时候不是很恰当,可以通过其他的构造函数来显示指定全局坐标值。
(附注:要区分参数button 和 参数buttons)
第二种:
参数type必须是QEvent::MouseButtonPress,QEvent::MouseButtonRelease,QEvent::MouseButtonDblClick, or QEvent::MouseMove其中的一个。
参数localpos是鼠标指针相对于窗口的位置,screenPos是鼠标相对于屏幕的位置
buttons,button,modifiers见上。
例子
#点击事件
def mousePressEvent(self, QGraphicsSceneMouseEvent):
if QGraphicsSceneMouseEvent.button() == Qt.MidButton:
self.middleMouseButtonPress(QGraphicsSceneMouseEvent)
elif QGraphicsSceneMouseEvent.button() == Qt.LeftButton:
self.leftMouseButtonPress(QGraphicsSceneMouseEvent)
elif QGraphicsSceneMouseEvent.button() == Qt.RightButton:
self.rightmouseButtonPress(QGraphicsSceneMouseEvent)
def middleMouseButtonPress(self, event):
# mid_Release=QMouseEvent(event.MouseButtonRelease,event.localPos(),event.screenPos(),Qt.LeftButton,Qt.NoButton,event.modifiers())
self.setDragMode(QGraphicsView.ScrollHandDrag)
# super().mouseReleaseEvent(mid_Release)
# 产生一个鼠标按下左键的假事件
fakeEvent = QMouseEvent(event.MouseButtonPress, event.localPos(), event.screenPos(),
Qt.LeftButton,Qt.LeftButton, event.modifiers())
super().mousePressEvent(fakeEvent)
这个fakeEvent是我自己建立的点击事件,fakeEvent的大多数参数来自event,event也是个点击事件,是mousePressEvent()函数(mousePressEvent函数是类本身有的)自带的事件。
fakeEvent的参数不好自己写,一般是从别的事件中获取。
再将定义好的事件传入继承父类的最初的鼠标事件中,这个事件就算执行了。