本节介绍了PyQt5中的鼠标常用操作。包括系统自带的鼠标样式、自定义鼠标样式、鼠标位置的相关操作。最终通过案例综合运用了鼠标事件。

Qt中的鼠标形状

在PyQt中,可用的鼠标形状有:

Qt.ArrowCursor
Qt.UpArrowCursor
Qt.CrossCursor
Qt.IBeamCursor
Qt.WaitCursor
Qt.BusyCursor
Qt.ForbiddenCursor
Qt.PointingHandCursor
Qt.WhatsThisCursor
Qt.SizeVerCursor
Qt.SizeHorCursor
Qt.SizeBDiagCursor
Qt.SizeFDiagCursor
Qt.SizeAllCursor
Qt.SplitVCursor
Qt.SplitHCursor
Qt.OpenHandCursor
Qt.ClosedHandCursor
Qt.BlankCursor

鼠标样式及对应的形状

测试鼠标样式

需要注意的是,把哪个对象设置了setCursor,就会在鼠标进入了这个区域后,变成了设置的样式。

# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys

# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)

# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("鼠标操作")  # 标题
window.resize(500, 500)  # 窗口的大小
window.move(400, 200)  # 窗口初次显示的位置

# 自定义鼠标的样式
window.setCursor(Qt.BusyCursor)

window.show()  # 显示窗口,不然啥也没有

sys.exit(app.exec_())

使用鼠标样式

其他样式可以自行尝试。

自定义鼠标样式

# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys

# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)

# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("鼠标操作")  # 标题
window.resize(500, 500)  # 窗口的大小
window.move(400, 200)  # 窗口初次显示的位置

# 在windows中自定义鼠标样式
pixmap = QPixmap("C:/Users/Administrator/Desktop/图片1.png")
new_pixmap = pixmap.scaled(30, 30)  # 对图片进行缩放,变成50X50的
cursor = QCursor(new_pixmap)
window.setCursor(cursor)

window.show()  # 显示窗口,不然啥也没有

sys.exit(app.exec_())

下面这个演示是没有对图片进行放缩的演示。

运行结果

QPixmap就是个图片对象。

QCursor类

鼠标形状重置

只需要使用一个函数unsetCursor即可重置鼠标样式

# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys

# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)

# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("鼠标操作")  # 标题
window.resize(500, 500)  # 窗口的大小
window.move(400, 200)  # 窗口初次显示的位置

# 在windows中自定义鼠标样式
pixmap = QPixmap("C:/Users/Administrator/Desktop/图片1.png")
new_pixmap = pixmap.scaled(30, 30)  # 对图片进行缩放,变成50X50的
cursor = QCursor(new_pixmap)
window.setCursor(cursor)

# 重置鼠标样式
window.unsetCursor()

window.show()  # 显示窗口,不然啥也没有

sys.exit(app.exec_())

鼠标重置

鼠标跟踪

  • hasMouseTracking():判定是否设置了鼠标跟踪
  • setMouseTracking(bool):
    • 设置鼠标是否跟踪
    • 所谓的鼠标跟踪,就是设置检测鼠标移动事件的条件
    • 不跟踪:鼠标移动时,必须处于按下的状态,才会触发mouseMoveEvent事件
    • 跟踪:鼠标移动时,不处于按下状态,也会触发mouseMoveEvent事件
# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys


class MyWindow(QWidget):
    def mouseMoveEvent(self, me):
        # print("鼠标移动了", me.globalPos())   # 全局的,相对整个屏幕而言的尺寸
        print("鼠标移动了", me.localPos())  # 局部的,相对小窗口而言的尺寸


# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)

# 创建一个QWidget类的窗口
window = MyWindow()
window.setWindowTitle("鼠标操作")  # 标题
window.resize(500, 500)  # 窗口的大小

window.setMouseTracking(True)  # 设置了鼠标跟踪

window.show()  # 显示窗口,不然啥也没有

sys.exit(app.exec_())

运行效果自己尝试即可。

鼠标事件的综合案例

要求:

  • 鼠标移入窗口时,让label位置跟随着鼠标
  • 将鼠标设置为指定图标
# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys


class Window(QWidget):
    def mouseMoveEvent(self, mv):
        print("鼠标移动", mv.localPos())
        label1 = self.findChild(QLabel)
        label1.move(mv.localPos().x(), mv.localPos().y())


# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)

# 创建一个QWidget类的窗口
window = Window()
window.setWindowTitle("鼠标事件案例")  # 标题
window.resize(500, 500)  # 窗口的大小
window.move(400, 200)  # 窗口初次显示的位置
window.setMouseTracking(True)

pixmap = QPixmap("飞机.png")
pixmap = pixmap.scaled(40, 40)  # 把图片缩小
cursor = QCursor(pixmap)
window.setCursor(cursor)


# 创建其他控件
label = QLabel(window)
label.setText("爱老虎油")
label.move(100, 100)
label.setStyleSheet("background-color: cyan")

window.show()  # 显示窗口,不然啥也没有

sys.exit(app.exec_())

飞机.png是我下载的矢量图。

运行效果

封装版程序,效果也是一样的:

# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("鼠标事件案例")  # 标题
        self.resize(500, 500)  # 窗口的大小
        self.move(400, 200)  # 窗口初次显示的位置
        self.setMouseTracking(True)

        pixmap = QPixmap("飞机.png")
        pixmap = pixmap.scaled(40, 40)
        cursor = QCursor(pixmap)
        self.setCursor(cursor)

        # 创建其他控件
        label = QLabel(self)
        self.label = label
        label.setText("爱老虎油")
        label.move(100, 100)
        label.setStyleSheet("background-color: cyan")

    def mouseMoveEvent(self, mv):
        print("鼠标移动", mv.localPos())
        # label1 = self.findChild(QLabel)
        self.label.move(mv.localPos().x(), mv.localPos().y())


# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)

# 创建一个QWidget类的窗口
window = Window()


window.show()  # 显示窗口,不然啥也没有

sys.exit(app.exec_())

博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/PyQt-mouseEvent.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 07 月 13 日
如果觉得我的文章对你有用,请随意赞赏