快捷搜索:  汽车  科技

pyqt5典型事件的默认处理函数,实战PyQt5:098-鼠标事件

pyqt5典型事件的默认处理函数,实战PyQt5:098-鼠标事件event对象中的pos()函数返回值为相对于控件的坐标,如果要转换成相对于父控件或者屏幕坐标,需要调用QWidget类的以下方法:重载mouseMoveEvent(self event) 可以处理鼠标指针的移动。在缺省情况下,只有按下鼠标键并移动时,才会调用mouseMoveEvent()。 如果要处理一般情况下的鼠标移动(比如未按下鼠标键) 需要调用setMouseTracking(True)。如果要处理窗口中鼠标移动的事件,需要调用grabMouse()。event参数是QMouseEvent对象,存储事件的其他信息。常用方法有:如果要让父控件继续收到鼠标事件,要调用事件的ignore()方法;否则,调用accept()。如果一个控件的Qt.WA_NoMousePropagation的属性设为True 则不会将事件传递给父控件。调用setAttribute( )方法可修改此参数

pyqt5典型事件的默认处理函数,实战PyQt5:098-鼠标事件(1)

鼠标GUI程序中另外一种重要的交互方式,Qt中的鼠标事件包括鼠标点击、松开鼠标按键,移动鼠标到指定区域或者离开特定区域,更改鼠标指针的形状等等。

鼠标点击释放

对鼠标最常见的操作就是点击和释放,进行点击释放操作,将调用以下方法:

  • mousePressEvent (self event) : 鼠标键按下时调用;
  • mouseReleaseEvent (self event) : 鼠标键松开时调用;
  • mouseDoubieCiickEvent (self event) - 双击鼠标时调用。

必须注意在双击之前的其他事件。双击时的事件顺序为:mouseButtonPress --> mouseButtonRelease --> mouseButtonDblClick --> mouseButtonPress --> mouseButtonRelease。

QApplicaption类的setDoubleClickInterval()方法可设置双击的时间间隔;doubleClickInterval( )方法返回双击的时间间隔。

event参数是QMouseEvent对象,存储事件的其他信息。常用方法有:

  • x() 和 y():返回相对于控件空间的鼠标坐标值;
  • pos(): 返回相对于控件空间的QPoint对象;
  • localPos():返回相对于控件空间的QPointF对象;
  • globalX() 和 globalY(): 返回相对于屏幕的x y 坐标值;
  • globalPos(): 返回相对于屏幕的QPoint对象;
  • windowPos(): 返回相对于窗口的QPointF对象;
  • screenPos() : 返回相对于屏幕的QPointF对象;
  • button(): 返回以下枚举值(只列举了部分),用以判断是哪个鼠标键触发了事件;
    • Qt.NoButton (0): 没有按下鼠标键。例如移动鼠标时的button()返回值;
    • Qt.LeftButton (1): 按下鼠标左键;
    • Qt.RightButton (2): 按下鼠标右键;
    • t.Mion 或 Qt.MiddleButton (4): 按下鼠标中键。
  • buttons(): 返回前面所列枚举值的组合,用于判断同时按下了哪些键;
  • modifiers(): 判断按下了哪些修饰键(Shift Ctrl Alt 等等);
  • timestamp() : 返回事件发生的时间。

如果要让父控件继续收到鼠标事件,要调用事件的ignore()方法;否则,调用accept()。如果一个控件的Qt.WA_NoMousePropagation的属性设为True 则不会将事件传递给父控件。调用setAttribute( )方法可修改此参数:

button.setAttribute (Qt.WA_NoMousePropagation True)

缺省情况下,鼠标事件只拦截控件区域中的鼠标操作。如果可拦截控件区域以外的鼠标事件,必须调用grabMouse()方法;释放时,调用releaseMouse()。

鼠标移动

重载mouseMoveEvent(self event) 可以处理鼠标指针的移动。在缺省情况下,只有按下鼠标键并移动时,才会调用mouseMoveEvent()。 如果要处理一般情况下的鼠标移动(比如未按下鼠标键) 需要调用setMouseTracking(True)。如果要处理窗口中鼠标移动的事件,需要调用grabMouse()。

event对象中的pos()函数返回值为相对于控件的坐标,如果要转换成相对于父控件或者屏幕坐标,需要调用QWidget类的以下方法:

  • mapToGlobal (point): 将窗口坐标转换成屏幕坐标;
  • mapFromGlobal(point): 将屏幕坐标转换成窗口坐标;
  • mapToParent(point): 将窗口坐标转换成父窗口坐标。如果没有父窗口,则相当于mapToGlobal(point);
  • mapFromParent(point) - 将父窗口坐标转换成窗口坐标。如果没有父窗口,则相当于mapFromGlobal(point);
  • mapTo (widget point) - 将窗口坐标转换成 widget父窗口坐标;
  • mapFrom (widget point) - 将 widget父窗口坐标转换成窗口坐标。
鼠标移入和移出控件

鼠标指针移进和移出控件时,下列方法将被调用:

  • enterEvent (self event):鼠标进入控件;
  • leaveEvent (self event) :鼠标离开控件。

参数event为QEvent对象。

鼠标滚轮操作

鼠标滚轮操作事件由wheelEvent(self event)方法来处理。参数event是一个QWheelEvent对象,它包含滚轮操作的相关信息。有以下常用方法可使用:

  • angleDelta( ): 返回QPoint对象,为滚轮转过的数值,单位为1/8度。例如:

angle=event.angleDelta( )/8 angleX=angle.x() angleY=angle.y()

  • pixelDeita (): 返回QPoint对象,为滚轮转过的像素值;
  • x() 和 y(): 返回相对于控件的当前鼠标的x y位置;
  • pos() :返回相对于控件的当前鼠标位置的QPoint对象;
  • posF() :返回相对于控件的当前鼠标位置的QPoinFt对象;
  • globalX() 和globalY(): 返回相对于屏幕的当前鼠标的x y位置;
  • globalPos(): 返回相对于屏幕的当前鼠标QPoint位置;
  • globalPosF(): 返回相对于屏幕的当前鼠标QPointF位置;
  • buttons():返回按下了哪些鼠标键,同‘鼠标点击释放’中buttons()。
  • modifiers():判断按下了哪些修饰键(Shift Ctrl Alt 等等);
  • timestamp():返回事件发生的时间。

如果要让父控件继续收到滚轮事件,要调用事件的ignore()方法;否则,调用accept()。

鼠标指针形状

QWidget类中以下方法设置和管理鼠标指针:

  • setCursor(qcr): 参数qcr为QCursor对象,在Qt.CursorShape中内建一些鼠标指针形状,如:
    • ArrowCursor: 标准箭头;
    • upArrowCursor: 向上箭头;
    • CrossCursor: 十字光标;
    • Waitcursor: 沙漏;

等常用鼠标形状。

  • unsetCursor() :取消设置的鼠标形状;
  • cursor(): 返回当前鼠标形状的QCursor对象;

使用QApplication类中的以下静态方法来控制整个应用程序的鼠标形状:

  • setOverrideCursor(qcr) - 参数qcr为QCursor对象或 Qt.CursorShape的枚举值;
  • restoreOverrideCursor() - 取消全局鼠标形状设置;
  • hangeOverrideCursor(qcr) - 将鼠标形状设置为qcr。只有先调用setOverrideCursor()了,该函数才起作用;
  • overrideCursor( ): 返回当前鼠标形状的QCursor 对象。

setOverrideCursor()和restoreOverrideCursor( )通常配合使用。

鼠标事件测试

测试程序中,使用鼠标演示了在窗口中绘制连续线,完整代码如下:

importsys fromPyQt5importQtCore QtGui QtWidgets fromPyQt5.QtCoreimportQt QEvent QPoint fromPyQt5.QtGuiimportQPainter QPen QPixmap fromPyQt5.QtWidgetsimportQApplication QWidget classDemoMouseEvent(QWidget): def__init__(self parent=None): super(DemoMouseEvent self).__init__(parent) #设置窗口标题 self.setWindowTitle('实战PyQt5:鼠标事件演示') #设置窗口大小 self.setFixedSize(480 320) self.beginPoint=QPoint()#起始点 self.endPoint=QPoint()#结束点 self.pixmap=QPixmap(self.rect().size()) self.pixmap.fill(Qt.lightGray) #重绘窗口事件 defpaintEvent(self event): pp=QPainter(self.pixmap) pp.setPen(QPen(Qt.blue 2))#设置画笔 #绘制直线 pp.drawLine(self.beginPoint self.endPoint) #上一直线的终点就是下一直线的起点 self.beginPoint=self.endPoint #在画布上画出 painter=QPainter(self) painter.drawPixmap(0 0 self.pixmap) defmousePressEvent(self event): #鼠标左键按下 ifevent.button()==Qt.LeftButton: self.startPoint=event.pos() defmouseReleaseEvent(self event): #鼠标左键释放 ifevent.button()==Qt.LeftButton: self.endPoint=event.pos() #重新绘制 self.update() defmouseMoveEvent(self event): #鼠标左键按下的同时移动鼠标 ifevent.buttons()andQt.LeftButton: self.endPoint=event.pos() #重新绘制 self.update() if__name__=='__main__': app=QApplication(sys.argv) window=DemoMouseEvent() window.show() sys.exit(app.exec())

运行结果如下图:

pyqt5典型事件的默认处理函数,实战PyQt5:098-鼠标事件(2)

测试鼠标事件

本文知识点
  • 了解各种鼠标事件;
  • 鼠标指针形状控制;
  • 使用QPainter,QPixmap在窗口中绘制连续折线。

喜欢本文内容就关注 收藏,点赞,评论和转发。

猜您喜欢: