侦测鼠标事件
这篇教学会介绍在 PyQt5 的视窗里,侦测鼠标的按下、放开、移动、卷动等事件,并根据鼠标事件,进行简单的互动应用。
快速导览:
- PyQt6 版本参考:PyQt6 教学 - 侦测鼠标事件
- 因为 Google Colab 不支援 PyQt5,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda )。
常用的鼠标事件
建立 PyQt5 的 Widget 元件之后,只要套用对应的侦测方法,就可以侦测鼠标的事件 ( 按下、放开、移动...等 ),下方列出常用的鼠标事件:
| 事件 | 说明 |
|---|---|
| mousePressEvent | 按下鼠标。 |
| mouseReleaseEvent | 放开鼠标。 |
| mouseDoubleClickEvent | 连点两下鼠标。 |
| mouseMoveEvent | 按下移动鼠标,设定 setMouseTracking(True) 可不需要按下鼠标。 |
| wheelEvent | 卷动鼠标滚轮。 |
| enterEvent | 鼠标进入。 |
| leaveEvent | 鼠标移出。 |
以下方的程序码执行后,会打开一个空白的视窗,在视窗里按下鼠标时,后台就会印出 press 的文字 ( 注意,对应事件的函数需要包含一个 self 参数 )。
from PyQt5 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
def mousePress(self):
print('press')
Form.mousePressEvent = mousePress # 新增按下滑鼠事件,事件發生時執行 mousePress 函式
Form.show()
sys.exit(app.exec_())
以下方的程序码执行后,当鼠标在视窗中移动时,会透过 QLabel 显示目前鼠标的座标。
from PyQt5 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
def mousePress(self):
print('press')
Form.mousePressEvent = mousePress
label = QtWidgets.QLabel(Form)
label.setGeometry(10,10,100,50)
label.setStyleSheet('font-size:24px;')
def mouseMove(self):
label.setText(f'{self.x()}, {self.y()}') # 透過 QLabel 顯示滑鼠座標
Form.setMouseTracking(True) # 設定不需要按下滑鼠,就能偵測滑鼠移動
Form.mouseMoveEvent = mouseMove # 滑鼠移動事件發生時,執行 mouseMove 函式
Form.show()
sys.exit(app.exec_())
侦测事件后可以取得的数值
取的鼠标事件后,就能透过下列的方法,取得常用的几个鼠标数值。
| 方法 | 说明 |
|---|---|
| x() | 鼠标在绑定元件里的 x 座标 ( 绑定元件左上角为 0,0 )。 |
| y() | 鼠标在绑定元件里的 y 座标 ( 绑定元件左上角为 0,0 )。 |
| globalX() | 鼠标在电脑屏幕里的 x 座标。 |
| globalY() | 鼠标在电脑屏幕里的 y 座标。 |
| button() | 按下哪个鼠标键,1 左键,2 右键,4 中键或滚轮。 |
| timestamp() | 按下鼠标键电脑时间 ( 毫秒 )。 |
下方的例子执行后,会使用 QLabel 显示按下哪个鼠标按键。
from PyQt5 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)
label = QtWidgets.QLabel(Form)
label.setGeometry(10,10,100,50)
label.setStyleSheet('font-size:24px;')
def mousePress(self):
print(self.button())
if self.button() == 1:
label.setText('按下左鍵')
elif self.button() == 2:
label.setText('按下右鍵')
else:
label.setText('')
Form.mousePressEvent = mousePress # 新增按下滑鼠事件,事件發生時執行 mousePress 函式
Form.show()
sys.exit(app.exec_())
改用 class 的写法
上方的程序码,亦可改用 class 的写法表示,比较需要注意的是要使用 event。
from PyQt5 import QtWidgets
import sys
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('oxxo.studio')
self.resize(300, 200)
self.ui()
def ui(self):
self.label = QtWidgets.QLabel(self)
self.label.setGeometry(10,10,100,50)
self.label.setStyleSheet('font-size:24px;')
def mousePressEvent(self, event):
print(event.button())
if event.button() == 1:
self.label.setText('按下左鍵')
elif event.button() == 2:
self.label.setText('按下右鍵')
else:
self.label.setText('')
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = MyWidget()
Form.show()
sys.exit(app.exec_())
微信扫码关注
抖音扫码关注