pyqt5事件與鼠標事件


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( )通常配合使用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章