iT邦幫忙

2022 iThome 鐵人賽

DAY 29
0

這篇教學會介紹在 PyQt5 的視窗裡,偵測滑鼠的按下、放開、移動、捲動等事件,並根據滑鼠事件,進行簡單的互動應用。

原文參考:偵測滑鼠事件

因為 Google Colab 不支援 PyQt5,所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda )。

PyQt5 教學 - 偵測滑鼠事件

常用的滑鼠事件

建立 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_())

PyQt5 教學 - 偵測滑鼠事件

偵測事件後可以取得的數值

取的滑鼠事件後,就能透過下列的方法,取得常用的幾個滑鼠數值。

方法 說明
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_())

PyQt5 教學 - 偵測滑鼠事件

更多 Python 教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我已經寫了超過 400 篇 Python 的教學,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 28 ) QSS ( Qt Style Sheet ) 樣式設定
下一篇
( Day 30 ) 偵測鍵盤事件與快速鍵組合
系列文
實戰 Python x PyQt5 軟體介面設計35
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言