pyqt5事件與鼠標事件
一、每個事件都被封裝成相應的類:
pyqt中,每個事件類型都被封裝成相應的事件類,如鼠標事件爲QMouseEvent,鍵盤事件爲QKeyEvent等。而它們的基類是QEvent。
二、基類QEvent的幾個重要方法:
accept() 表示事件已處理,不需要向父窗口傳播
ignore()表示事件未處理,繼續向父窗口傳播f
type()返回事件類型,如QtCore.QEvent.MouseButtonPress,一般由基事件調用。因爲其它事件已經知道自己的事件類型了。
還有一個自定義事件的註冊方法。
三、QMouseEvent鼠標事件:
buttons()返回哪個鼠標按鍵被按住了。如Qt.LeftButton
globalPos()返回鼠標相對屏幕的位置QPoint
pos()返回鼠標相對處理事件的窗口的位置
四、處理鼠標事件的響應函數(在QWidget及其繼承類中):
mousePressEvent(QMouseEvent)
mouseReleaseEvent(event)
mouseMoveEvent(event)
五、鼠標事件的具體內容
1.按下、鬆開鼠標按鍵
按下並釋放鼠標按鈕時,將調用以下方法:
mousePressEvent (self, event) - 鼠標鍵按下時調用;
mouseReleaseEvent (self, event) - 鼠標鍵公開時調用;
mouseDoubieCiickEvent (self, event) - 雙擊鼠標時調用。必須注意,在雙擊之前的其他事件。雙擊時的事件順序如下:
MouseButtonPress
MouseButtonRelease
MouseButtonDblClick
MouseButtonPress
MouseButtonRelease
QApplicaption類的setDoubleClickInterval( )方法可設置雙擊的時間間隔;doubleClickInterval( )方法返回雙擊的時間間隔。
event參數是QMouseEvent對象,存儲事件的其他信息。有以下方法:
x() 和 y() -返回相對於控件空間的鼠標座標值;
pos() - 返回相對於控件空間的QPoint對象;
localPos()- 返回相對於控件空間的QPointF對象;
globalX() 和 globalY() - 返回相對於屏幕的x,y 座標值;
globalPos() - 返回相對於屏幕的QPoint對象;
windowPos() - 返回相對於窗口的QPointF對象;
screenPos() - 返回相對於屏幕的QPointF對象;
button() - 返回以下枚舉值(只列了部分,詳細內容參見http://doc.qt.io/qt-5/qt.html#MouseButton-enum),用以判斷是哪個鼠標健觸發了事件。
QtCore.Qt.NoButton - 0 - 沒有按下鼠標鍵。例如移動鼠標時的button()返回值;
QtCore.Qt.LeftButton -1 -按下鼠標左鍵;
QtCore.Qt.RightButton -2 -按下鼠標右鍵;
QtCore.Qt.Mion 或 QtCore.Qt.MiddleButton -4 -按下鼠標中鍵;
buttons() - 返回前面所列枚舉值的組合,用於判斷同時按下了哪些鍵。
modifiers() - 判斷按下了哪些修飾鍵(Shift,Ctrl , Alt,等等),詳見鍵盤事件(18)中的modifiers()。
timestamp() - 返回事件發生的時間;
如果要讓父控件繼續收到鼠標事件,要調用事件的ignore()方法;否則,調用accept()。
如果一個控件的QtCore.Qt.WA_NoMousePropagation的屬性設爲True,則不會將事件傳遞給父控件。調用setAttribute( )方法可修改此參數:
button.setAttribute (QtCore.Qt.WA_NoMousePropagation, True)
缺省情況下,鼠標事件只攔截控件區域上的鼠標操作。如果可攔截控件區域以下的鼠標事件,必須調用grabMouse( )方法;釋放時,調用releaseMouse( )。
2.鼠標指針
要處理鼠標指針的移動,需要重載mouseMoveEvent(self,event)方法。缺省情況下,只有按下鼠標鍵移動時,纔會調用mouseMoveEvent( )。如果要處理包括普通的移動,需要以參數爲True調用setMouseTracking() 方法。如果要處理窗口中鼠標移動的事件,需要調用grabMouse( )方法。
event對象的pos( )返回值爲相對控件的座標,要轉換成相對父控件或屏幕的座標,需要調用QWidget類的以下方法:
mapToGlobal (QPoint) - 將窗口座標轉換成屏幕座標;
mapFromGlobal(QPoint) - 將屏幕座標轉換成窗口座標;
mapToParent(QPoint) - 將窗口座標轉換成父窗口座標。如果沒有父窗口,則相當於mapToGlobal (QPoint);
mapFromParent(QPoint) - 將父窗口座標轉換成窗口座標。如果沒有父窗口,則相當於mapFromGlobal(QPoint);
mapTo (QWidget, QPoint) - 將窗口座標轉換成 QWidget父窗口座標;
mapFrom (QWidget, QPoint) - 將 QWidget父窗口座標轉換成窗口座標;
3. 鼠標移進和移出控件 鼠標移進和移出控件時,下列方法將被調用:
enterEvent (self, event) -鼠標進入控件;
leaveEvent (self, event) - 鼠標離開控件;
event是一個QEvent對象,並不包括附加信息。
4.滾動鼠標
wheelEvent (self, event)方法可用來處理鼠標滾動事件。event是一個QWheelEvent對象,包含滾輪操作的相關信息。有以下方法可調用:
angleDelta( ) - 返回QPoint對象,爲滾輪轉過的數值,單位爲1/8度。例如:
angle=event.angleDelta( ) /8
angleX=angle.x()
angleY=angle.y()
pixelDeita () - 返回QPoint對象,爲滾輪轉過的像素值。
x() 和 y() - 返回相對於控件的當前鼠標的x,y位置;
pos() - 返回相對於控件的當前鼠標位置的QPoint對象;
posF() - 返回相對於控件的當前鼠標位置的QPoinFt對象;
globalX() 和globalY() - 返回相對於屏幕的當前鼠標的x,y位置;
globalPos() - 返回相對於屏幕的當前鼠標QPoint位置;
globalPosF() - 返回相對於屏幕的當前鼠標QPointF位置;
buttons(),modifiers()和timestamp()的用法參見本文“1.按下、鬆開鼠標按鍵”中的相關內容。
如果要讓父控件繼續收到滾輪事件,要調用事件的ignore()方法;否則,調用accept()。
5.更改鼠標指針形狀
要修改鼠標進入控件後的形狀,可調用QWidget的下列方法:
setCursor(QCursor qcr) - 參數qcr爲QCursor對象或 Qtcore.Qt 類的枚舉值,如:ArrowCursor(標準箭頭)、upArrowCursor(向上箭頭)、 CrossCursor(十字光標)、Waitcursor (沙漏),等等。
setCursor(QtCore.Qt.WaitCursor)
unsetCursor() - 取消設置的鼠標形狀。
cursor() - 返回當前鼠標形狀的QCursor對象,。
使用QApplication類中的以下靜態方法來控制整個應用程序的鼠標形狀:
setOverrideCursor(QCursor qcr) - 參數qcr爲QCursor對象或 Qtcore.Qt 類的枚舉值。
restoreOverrideCursor() - 取消全局鼠標形狀設置;
changeOverrideCursor(QCursor qcr) - 將鼠標形狀設置爲qcr。只有先調用setOverrideCursor( )了,該函數才起作用。
overrideCursor( ) - 返回當前鼠標形狀的QCursor 對象;
setOverrideCursor()和restoreOverrideCursor( )通常配合使用。