017.PyQt5_QWidget_鼠标操作

鼠标操作

  • 设置鼠标形状
    控件.setCursor('枚举类型参数')
    
    # 根据枚举类型设置该控件内鼠标显示的图标样式
    
  • 鼠标样式展示
    API 样图
    window.setCursor(Qt.ArrowCursor)

    window.setCursor(Qt.UpArrowCursor)

    window.setCursor(Qt.CrossCursor)

    window.setCursor(Qt.IBeamCursor)

    window.setCursor(Qt.WaitCursor)

    window.setCursor(Qt.BusyCursor)

    window.setCursor(Qt.ForbiddenCursor)

    window.setCursor(Qt.PointingHandCurso

    window.setCursor(Qt.WhatsThisCursor)

    window.setCursor(Qt.SizeVerCursor)

    window.setCursor(Qt.SizeHorCursor)

    window.setCursor(Qt.SizeBDiagCursor)

    window.setCursor(Qt.SizeAllCursor)

    window.setCursor(Qt.SplitVCursor)

    window.setCursor(Qt.SplitHCursor)

    window.setCursor(Qt.OpenHandCursor)

    window.setCursor(Qt.ClosedHandCursor)

    window.setCursor(Qt.BlankCursor)

  • 自定义鼠标样式_QCursor对象
  • 通过创建QCursor对象来设置自定义鼠标样式
    from PyQt5.Qt import *
    import sys
    
    app = QApplication(sys.argv)
    window = QWidget()
    window.resize(500, 500)
    window.setWindowTitle("自定义鼠标样式")
    
    # 创建QPixmap对象,并设置显示的图片
    pixmap = QPixmap("2.png")
    
    # 设置对象宽和高按比例缩小,返回一个新对象
    new_pixmap = pixmap.scaled(20, 20)
    
    # 创建QCursor对象(鼠标对象),用作setCursor参数
    # 设置该对象的作用点为图片的左上角(0,0),默认是图片中心点
    cursor = QCursor(new_pixmap, 0, 0)
    
    # 设置window控件的鼠标样式为自定义的QCursor对象:cursor
    window.setCursor(cursor)
    
    window.show()
    sys.exit(app.exec_())
    
    • 017.PyQt5_QWidget_鼠标操作_第1张图片


  • 重置鼠标样式
    控件.unsetCursor()
    
  • 如果之前设置了鼠标的样式,通过 unsetCursor() 方法还原鼠标样式为默认样式
    from PyQt5.Qt import *
    import sys
    
    app = QApplication(sys.argv)
    window = QWidget()
    window.resize(500, 500)
    window.setWindowTitle("自定义鼠标样式")
    
    # 创建QPixmap对象,并设置显示的图片
    pixmap = QPixmap("2.png")
    
    # 设置对象宽和高按比例缩小,返回一个新对象
    new_pixmap = pixmap.scaled(20, 20)
    
    # 创建QCursor对象(鼠标对象),用作setCursor参数
    # 设置该对象的作用点为图片的左上角(0,0)
    cursor = QCursor(new_pixmap, 0, 0)
    
    window.setCursor(cursor)
    
    # 鼠标样式重置:还原鼠标样式为默认样式
    window.unsetCursor()
    
    window.show()
    sys.exit(app.exec_())
    

  • 获取鼠标对象
    控件.cursor()
    
    # 返回一个QCursor对象
    
  • 获取到鼠标对象之后,就可以进一步的获取到鼠标对象的一系列东西
  1. 获取鼠标样式图片
    QCursor对象.pixmap()
    
  2. 获取鼠标相对于桌面的位置(x, y)
    QCursor对象.pos()
    
  3. 设置鼠标默认出现位置,相对于桌面(x, y)
    QCursor对象.setPos(x, y)
    

  • 鼠标跟踪
  • 概念
    • 所谓的鼠标跟踪,其实就是设置检测鼠标移动事件的条件
    • 不跟踪:鼠标移动时,必须处于按下状态,才会触发mouseMoveEvent事件
    • 跟踪:鼠标移动时,不处于按下状态,也会触发mouseMoveEvent事件
  • 设置鼠标是否跟踪API
    控件.setMouseTracking(bool)
    
  • 获取鼠标是否跟踪
    控件.hasMouseTracking()
    
    # 返回True 或者 False
    
  • mouseMoveEvent事件会传递一个QMouseEvent对象,通过这个对象可以获取到相应的一些属性
    QMouseEvent.button          # 返回产生事件的按钮
                                # 需要注意的是,对于鼠标移动事件,该函数返回值总是Qt.NoButton
    QMouseEvent.buttons         # 返回产生事件的按钮状态
                                # 函数返回当前按下的所有按钮,按钮状态可以是
                                  Qt.LeftButton       左键
                                  Qt.RightButton      右键
                                  Qt.MidButton        中键
                                  或运算组合          多键同时按下
    QMouseEvent.flags
    
    QMouseEvent.globalX()       # 获取该对象的全局X轴位置,相对于桌面而言
    QMouseEvent.globalY()       # 获取该对象的全局Y轴位置,相对于桌面而言
    QMouseEvent.globalPos()     # 获取该对象的全局位置(x, y),相对于桌面而言
    QMouseEvent.screenPos()     # 获取该对象的全局位置(x.0, y.0),相对于桌面而言
    
    QMouseEvent.x()             # 获取该对象的局部X轴位置,相对于父对象而言
    QMouseEvent.y()             # 获取该对象的局部y轴位置,相对于父对象而言
    QMouseEvent.pos()           # 获取该对象的局部位置(x, y),相对于父对象而言
    QMouseEvent.localPos()      # 获取该对象的局部位置(x.0, y.0),相对于父对象而言
    
    • 017.PyQt5_QWidget_鼠标操作_第2张图片

  • 示例
    from PyQt5.Qt import *
    import sys
    
    class MyWidget(QWidget):
        def mouseMoveEvent(self, ms):
            print('鼠标移动了', ms.globalPos())
            # print('鼠标移动了', ms.localPos())
            # print('鼠标移动了', ms.globalX(),ms.globalY())
            # print('鼠标移动了', ms.pos())
            # print('鼠标移动了', ms.screenPos())
    
    app = QApplication(sys.argv)
    window = MyWidget()
    window.resize(500, 500)
    window.setWindowTitle("鼠标跟踪")
    
    #  设置鼠标跟踪开启
    window.setMouseTracking(True)
    
    window.show()
    sys.exit(app.exec_())
    

  • 鼠标跟踪案例
  • 创建一个窗口,内部有一个label控件
  • 鼠标移入窗口时,让label位置跟随随表位置
  • 让鼠标设置为指定图标
  • 代码演示
    from PyQt5.Qt import *
    import sys
    
    class MyWidget(QWidget):
        def mouseMoveEvent(self, ms) -> None:
    
            # 获取指定类型,指定对象名称的子控件
            label = self.findChild(QLabel, 'label2')
            # 设置label的位置方法一
            # ms_pos = ms.pos()
            # label.move(ms_pos)
            ms_pos = ms.localPos()
            label.move(int(ms_pos.x()), int(ms_pos.y()))
    
    
    app = QApplication(sys.argv)
    window = MyWidget()
    window.resize(500, 500)
    window.setWindowTitle("鼠标跟踪案例")
    
    # 设置鼠标样式为指定图片
    pixmap = QPixmap('2.png')
    new_pixmap = pixmap.scaled(20, 20)
    cursor = QCursor(new_pixmap, 0, 0)
    window.setCursor(cursor)
    
    # 窗口添加label标签控件
    label1 = QLabel(window)
    label1.setObjectName('label1')
    label1.setText('鼠标跟踪案例1')
    label1.move(100, 100)
    label1.setStyleSheet("background-color:cyan;")
    
    label2 = QLabel(window)
    label2.setObjectName('label2')
    label2.setText('鼠标跟踪案例2')
    label2.move(200, 200)
    label2.setStyleSheet("background-color:red;")
    
    
    # 设置窗口开启鼠标跟踪
    window.setMouseTracking(True)
    
    
    window.show()
    sys.exit(app.exec_())
    

你可能感兴趣的:(PyQt5,qt5,pyqt,python,qt,开发语言)