PyQt5編程(19):鼠標(biāo)事件

處理鼠標(biāo)事件的頻率不低于鍵盤事件。包括按下悬赏、松開鼠標(biāo)按鍵罢低;移動鼠標(biāo)到特定區(qū)域或離開特定區(qū)域;更改鼠標(biāo)指針的形狀,等等劈彪。
1.按下臣淤、松開鼠標(biāo)按鍵
按下并釋放鼠標(biāo)按鈕時,將調(diào)用以下方法:

mousePressEvent (self,  event) - 鼠標(biāo)鍵按下時調(diào)用;
mouseReleaseEvent (self, event) - 鼠標(biāo)鍵公開時調(diào)用;
mouseDoubieCiickEvent (self, event) - 雙擊鼠標(biāo)時調(diào)用嫌松。必須注意沪曙,在雙擊之前的其他事件。雙擊時的事件順序如下:
MouseButtonPress
MouseButtonRelease
MouseButtonDblClick
MouseButtonPress
MouseButtonRelease
QApplicaption類的setDoubleClickInterval( )方法可設(shè)置雙擊的時間間隔萎羔;doubleClickInterval( )方法返回雙擊的時間間隔液走。

event參數(shù)是QMouseEvent對象,存儲事件的其他信息贾陷。有以下方法:

x() 和 y() -返回相對于控件空間的鼠標(biāo)坐標(biāo)值;
pos() - 返回相對于控件空間的QPoint對象;
localPos()- 返回相對于控件空間的QPointF對象;
globalX() 和 globalY() -  返回相對于屏幕的x,y 坐標(biāo)值缘眶;
globalPos() - 返回相對于屏幕的QPoint對象;
windowPos() -  返回相對于窗口的QPointF對象; 
screenPos() - 返回相對于屏幕的QPointF對象; 
button() - 返回以下枚舉值(只列了部分,詳細內(nèi)容參見http://doc.qt.io/qt-5/qt.html#MouseButton-enum)髓废,用以判斷是哪個鼠標(biāo)健觸發(fā)了事件巷懈。
    QtCore.Qt.NoButton - 0 - 沒有按下鼠標(biāo)鍵。例如移動鼠標(biāo)時的button()返回值慌洪;
    QtCore.Qt.LeftButton -1 -按下鼠標(biāo)左鍵顶燕;
    QtCore.Qt.RightButton -2 -按下鼠標(biāo)右鍵;
    QtCore.Qt.Mion 或 QtCore.Qt.MiddleButton -4 -按下鼠標(biāo)中鍵冈爹;

buttons() - 返回前面所列枚舉值的組合涌攻,用于判斷同時按下了哪些鍵。
modifiers() - 判斷按下了哪些修飾鍵(Shift,Ctrl , Alt,等等),詳見鍵盤事件(18)中的modifiers()频伤。
timestamp() - 返回事件發(fā)生的時間癣漆;

如果要讓父控件繼續(xù)收到鼠標(biāo)事件,要調(diào)用事件的ignore()方法剂买;否則惠爽,調(diào)用accept()。
如果一個控件的QtCore.Qt.WA_NoMousePropagation的屬性設(shè)為True,則不會將事件傳遞給父控件瞬哼。調(diào)用setAttribute( )方法可修改此參數(shù):
button.setAttribute (QtCore.Qt.WA_NoMousePropagation, True)
缺省情況下婚肆,鼠標(biāo)事件只攔截控件區(qū)域上的鼠標(biāo)操作。如果可攔截控件區(qū)域以下的鼠標(biāo)事件坐慰,必須調(diào)用grabMouse( )方法较性;釋放時用僧,調(diào)用releaseMouse( )。
2.鼠標(biāo)指針
要處理鼠標(biāo)指針的移動赞咙,需要重載mouseMoveEvent(self责循,event)方法。缺省情況下攀操,只有按下鼠標(biāo)鍵移動時院仿,才會調(diào)用mouseMoveEvent( )。如果要處理包括普通的移動速和,需要以參數(shù)為True調(diào)用setMouseTracking() 方法歹垫。如果要處理窗口中鼠標(biāo)移動的事件,需要調(diào)用grabMouse( )方法颠放。
 event對象的pos( )返回值為相對控件的坐標(biāo)排惨,要轉(zhuǎn)換成相對父控件或屏幕的坐標(biāo),需要調(diào)用QWidget類的以下方法:

mapToGlobal (QPoint) - 將窗口坐標(biāo)轉(zhuǎn)換成屏幕坐標(biāo);
mapFromGlobal(QPoint) - 將屏幕坐標(biāo)轉(zhuǎn)換成窗口坐標(biāo); 
mapToParent(QPoint) - 將窗口坐標(biāo)轉(zhuǎn)換成父窗口坐標(biāo)碰凶。如果沒有父窗口暮芭,則相當(dāng)于mapToGlobal (QPoint);
mapFromParent(QPoint) - 將父窗口坐標(biāo)轉(zhuǎn)換成窗口坐標(biāo)。如果沒有父窗口欲低,則相當(dāng)于mapFromGlobal(QPoint);
mapTo (QWidget, QPoint) - 將窗口坐標(biāo)轉(zhuǎn)換成 QWidget父窗口坐標(biāo);
mapFrom (QWidget, QPoint) - 將 QWidget父窗口坐標(biāo)轉(zhuǎn)換成窗口坐標(biāo);

3. 鼠標(biāo)移進和移出控件
鼠標(biāo)移進和移出控件時谴麦,下列方法將被調(diào)用:

enterEvent (self, event) -鼠標(biāo)進入控件;
leaveEvent (self, event) - 鼠標(biāo)離開控件;

 event是一個QEvent對象,并不包括附加信息伸头。
4.滾動鼠標(biāo)
wheelEvent (self, event)方法可用來處理鼠標(biāo)滾動事件匾效。event是一個QWheelEvent對象,包含滾輪操作的相關(guān)信息恤磷。有以下方法可調(diào)用:

angleDelta( ) - 返回QPoint對象面哼,為滾輪轉(zhuǎn)過的數(shù)值,單位為1/8度扫步。例如:
angle=event.angleDelta( ) /8
angleX=angle.x()
angleY=angle.y()
pixelDeita () - 返回QPoint對象魔策,為滾輪轉(zhuǎn)過的像素值。
x() 和 y() - 返回相對于控件的當(dāng)前鼠標(biāo)的x,y位置;
pos() - 返回相對于控件的當(dāng)前鼠標(biāo)位置的QPoint對象;
posF() - 返回相對于控件的當(dāng)前鼠標(biāo)位置的QPoinFt對象;
globalX() 和globalY() - 返回相對于屏幕的當(dāng)前鼠標(biāo)的x,y位置;
globalPos() - 返回相對于屏幕的當(dāng)前鼠標(biāo)QPoint位置;
globalPosF() - 返回相對于屏幕的當(dāng)前鼠標(biāo)QPointF位置;
buttons(),modifiers()和timestamp()的用法參見本文“1.按下河胎、松開鼠標(biāo)按鍵”中的相關(guān)內(nèi)容闯袒。

如果要讓父控件繼續(xù)收到滾輪事件,要調(diào)用事件的ignore()方法游岳;否則政敢,調(diào)用accept()。
5.更改鼠標(biāo)指針形狀
要修改鼠標(biāo)進入控件后的形狀胚迫,可調(diào)用QWidget的下列方法:
setCursor(QCursor qcr) - 參數(shù)qcr為QCursor對象或 Qtcore.Qt 類的枚舉值,如:ArrowCursor(標(biāo)準箭頭)喷户、upArrowCursor(向上箭頭)、 CrossCursor(十字光標(biāo))访锻、Waitcursor (沙漏)褪尝,等等闹获。
setCursor(QtCore.Qt.WaitCursor)

unsetCursor() -  取消設(shè)置的鼠標(biāo)形狀。
cursor() - 返回當(dāng)前鼠標(biāo)形狀的QCursor對象河哑,避诽。

使用QApplication類中的以下靜態(tài)方法來控制整個應(yīng)用程序的鼠標(biāo)形狀:

setOverrideCursor(QCursor qcr) - 參數(shù)qcr為QCursor對象或 Qtcore.Qt 類的枚舉值。
restoreOverrideCursor() - 取消全局鼠標(biāo)形狀設(shè)置璃谨;
changeOverrideCursor(QCursor qcr) - 將鼠標(biāo)形狀設(shè)置為qcr沙庐。只有先調(diào)用setOverrideCursor( )了,該函數(shù)才起作用睬罗。
overrideCursor( ) - 返回當(dāng)前鼠標(biāo)形狀的QCursor 對象轨功;

setOverrideCursor()和restoreOverrideCursor( )通常配合使用旭斥。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末容达,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子垂券,更是在濱河造成了極大的恐慌花盐,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菇爪,死亡現(xiàn)場離奇詭異算芯,居然都是意外死亡,警方通過查閱死者的電腦和手機凳宙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門熙揍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人氏涩,你說我怎么就攤上這事届囚。” “怎么了是尖?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵意系,是天一觀的道長。 經(jīng)常有香客問我饺汹,道長蛔添,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任兜辞,我火速辦了婚禮迎瞧,結(jié)果婚禮上子刮,老公的妹妹穿的比我還像新娘验辞。我一直安慰自己,他們只是感情好邮府,可當(dāng)我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布胁塞。 她就那樣靜靜地躺著咏尝,像睡著了一般压语。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上编检,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天胎食,我揣著相機與錄音,去河邊找鬼允懂。 笑死厕怜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蕾总。 我是一名探鬼主播粥航,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼生百!你這毒婦竟也來了递雀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤蚀浆,失蹤者是張志新(化名)和其女友劉穎缀程,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體市俊,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡杨凑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了摆昧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撩满。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绅你,靈堂內(nèi)的尸體忽然破棺而出伺帘,到底是詐尸還是另有隱情,我是刑警寧澤勇吊,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布曼追,位于F島的核電站,受9級特大地震影響汉规,放射性物質(zhì)發(fā)生泄漏礼殊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一针史、第九天 我趴在偏房一處隱蔽的房頂上張望晶伦。 院中可真熱鬧,春花似錦啄枕、人聲如沸婚陪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泌参。三九已至脆淹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沽一,已是汗流浹背盖溺。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留铣缠,地道東北人烘嘱。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蝗蛙,于是被迫代替她去往敵國和親蝇庭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容