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