偵測滑鼠事件
這篇教學會介紹在 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())
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~