PyQt5編程:鼠標事件

參考連接:https://www.cnblogs.com/zhuluqing/p/9028816.htmlhtml

1、每一個事件都被封裝成相應的類:

pyqt中,每一個事件類型都被封裝成相應的事件類,如鼠標事件爲QMouseEvent,鍵盤事件爲QKeyEvent等。而它們的基類是QEvent。python

2、基類QEvent的幾個重要方法:

accept() 表示事件已處理,不須要向父窗口傳播ide

ignore()表示事件未處理,繼續向父窗口傳播f函數

type()返回事件類型,如QtCore.QEvent.MouseButtonPress,通常由基事件調用。由於其它事件已經知道本身的事件類型了。spa

還有一個自定義事件的註冊方法。指針

3、QMouseEvent鼠標事件:

buttons()返回哪一個鼠標按鍵被按住了。如Qt.LeftButtonrest

globalPos()返回鼠標相對屏幕的位置QPointcode

pos()返回鼠標相對處理事件的窗口的位置htm

4、處理鼠標事件的響應函數(在QWidget及其繼承類中):

mousePressEvent(QMouseEvent)對象

mouseReleaseEvent(event)

mouseMoveEvent(event)

# 事件。 """重寫鼠標事件,實現窗口拖動。""" def mousePressEvent(self, event): if event.buttons() == Qt.LeftButton: self.setCursor(Qt.OpenHandCursor) self.parent.m_drag = True self.parent.m_DragPosition = event.globalPos()-self.parent.pos() event.accept() def mouseMoveEvent(self, event): try: if event.buttons() and Qt.LeftButton: self.parent.move(event.globalPos()-self.parent.m_DragPosition)#move將窗口移動到指定位置 event.accept() except AttributeError: pass def mouseReleaseEvent(self, event): if event.button()==Qt.LeftButton: self.m_drag = False self.unsetCursor() 

6、處理鼠標事件的一些常見操做:

處理鼠標事件的頻率不低於鍵盤事件。包括按下、鬆開鼠標按鍵;移動鼠標到特定區域或離開特定區域;更改鼠標指針的形狀,等等。

    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( )一般配合使用。

相關文章
相關標籤/搜索