#資料 http://blog.sina.com.cn/s/blog_6483fa330102xo6w.html
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel
from PyQt5.QtGui import QCursor
from PyQt5.QtCore import Qt
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.label = QLabel('Hello World', self)
self.label1 = QLabel('喂 世界', self)
self.label1.move(0, 30)
self.label2 = QLabel('鼠標位置', self)
self.resize(500, 300)
self.label.resize(200, 20)
self.label1.resize(200, 20)
self.label2.resize(400, 20)
self.label2.move(0, 60)
self.label3 = QLabel('鼠標位置', self)
self.label3.resize(400, 20)
self.label3.move(0, 90)
self.setMouseTracking(True) # 設置鼠標移動跟蹤是否有效
'''
設置為True時,只要鼠標在窗口內移動時mouseMoveEvent事件就能捕獲
設置為False時(默認),只有鼠標鍵按下並在窗口內移動時mouseMoveEvent事件才能捕獲
注意只能是QWidget,如果是QMainwindow,則無效
self.hasMouseTracking()返回設置的狀態
'''
def mousePressEvent(self, event): # 鼠標鍵按下時調用(任意一個鍵,按一下調一次),這些方法是許多控件自帶的,這里來自於QWidget。
self.label.setText('鼠標鍵按下了')
n = event.button() # 用來判斷是哪個鼠標健觸發了事件【返回值:0 1 2 4】
'''
QtCore.Qt.NoButton - 0 - 沒有按下鼠標鍵
QtCore.Qt.LeftButton -1 -按下鼠標左鍵
QtCore.Qt.RightButton -2 -按下鼠標右鍵
QtCore.Qt.Mion 或 QtCore.Qt.MiddleButton -4 -按下鼠標中鍵
'''
nn = event.buttons() # 返回前面所列枚舉值的組合,用於判斷同時按下了哪些鍵【不知怎么判斷】 <PyQt5.QtCore.Qt.MouseButtons object at 0x0000003326982F98>
def mouseReleaseEvent(self, event): #鼠標鍵釋放時調用
#參數1:鼠標的作用對象;參數2:鼠標事件對象,用來保存鼠標數據
self.label.setText('鼠標鍵放開了')
def mouseMoveEvent(self, event): # 鼠標移動事件
ret = self.hasMouseTracking() #返回鼠標MouseTracking的狀態
self.label1.setText('鼠標移動了:%s' % ret)
x = event.x() # 返回鼠標相對於窗口的x軸坐標
y = event.y() # 返回鼠標相對於窗口的y軸坐標
self.label2.setText('鼠標x坐標:%s ,鼠標y坐標:%s' % (x, y))
xy = event.pos() #返回鼠標坐標 ,QPoint(463, 0) 相對於控件 【用xy.x() xy.y()提取值】
s=event.localPos() #返回鼠標坐標 相對於控件 QPointF(2.0, 2.0)
s = self.mapToGlobal(xy) # 將窗口坐標轉換成屏幕坐標.屬於QWidget類的方法;參數類型QPoint
self.label3.setText('鼠標x坐標:%s ,鼠標y坐標:%s' % (xy.x(), xy.y()))
xy1 = event.globalPos() # 返回鼠標相對於屏幕的坐標。PyQt5.QtCore.QPoint(1096, 37)【用xy1.x() xy1.y()提取值】
s1 = self.mapFromGlobal(xy1) #將屏幕坐標轉換成窗口坐標.屬於QWidget類的方法;參數類型QPoint
# mapToParent(QPoint) - 將窗口坐標轉換成父窗口坐標。如果沒有父窗口,則相當於mapToGlobal (QPoint)
# mapFromParent(QPoint) - 將父窗口坐標轉換成窗口坐標。如果沒有父窗口,則相當於mapFromGlobal(QPoint)
# mapTo (QWidget, QPoint) - 將窗口坐標轉換成 QWidget父窗口坐標
px = event.globalX() # 返回相對於屏幕的x坐標
py = event.globalY() # 返回相對於屏幕的y坐標
s = event.windowPos() # 相對於窗口的坐標(保留一位小數),PyQt5.QtCore.QPointF(481.0, 1.0)【用s.x() s.y()提取值】
p = event.screenPos() # 相對於屏幕的坐標(保留一位小數).PyQt5.QtCore.QPointF(476.0, 49.0)【用p.x() p.y()提取值】
t = event.timestamp() # 返回事件發生的時間。【以程序運行開始計時,以毫秒為單位】
def mouseDoubleClickEvent(self, event): # 鼠標雙擊時調用
self.label1.setText('雙擊了鼠標')
'''雙擊時的事件順序如下:
MouseButtonPress
MouseButtonRelease
MouseButtonDblClick
MouseButtonPress
MouseButtonRelease
QApplicaption類的setDoubleClickInterval( )方法可設置雙擊的時間間隔;doubleClickInterval( )方法返回雙擊的時間間隔。'''
def enterEvent(self, event): # 鼠標移進時調用
print('鼠標移進窗口了')
self.setCursor(Qt.CrossCursor) # 設置鼠標形狀。
#需要from PyQt5.QtGui import QCursor,from PyQt5.QtCore import Qt
#鼠標形狀對照圖見下方
# self.unsetCursor() #鼠標恢復系統默認
def leaveEvent(self, event): # 鼠標移出時調用
print('鼠標移出窗口了')
def wheelEvent(self, event): # 滾輪滾動時調用。event是一個QWheelEvent對象
angle = event.angleDelta() # 返回滾輪轉過的數值,單位為1/8度.PyQt5.QtCore.QPoint(0, 120)
angle = angle / 8 # 除以8之后單位為度。PyQt5.QtCore.QPoint(0, 15) 【向前滾是正數,向后滾是負數 用angle.y()取值】
ang = event.pixelDelta() # 返回滾輪轉過的像素值 【不知為何 沒有值】
# print(event.x(),event.y()) #返回鼠標相對於窗口的坐標
w = event.pos() # 返回相對於控件的當前鼠標位置.PyQt5.QtCore.QPoint(260, 173)
w1 = event.posF() # 返回相對於控件的當前鼠標位置.PyQt5.QtCore.QPointF(302.0, 108.0)
# 坐標函數與上面相同
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec())
鼠標形狀對應圖
QCursor 自定義鼠標:
from PyQt5.QtWidgets import QApplication, QWidget,QLabel,QPushButton import sys from PyQt5.QtGui import QCursor from PyQt5.QtCore import Qt from PyQt5.QtGui import QPainter, QPixmap class win(QWidget): #創建一個類,為了集成控件 def __init__(self): super(win, self).__init__() self.setWindowTitle('窗口標題') self.resize(400,300) self.setup_ui()#控件布局函數 def setup_ui(self): #控件布局 label = QLabel('標簽控件', self) button = QPushButton('按鈕', self) label.move(10, 10) label.setStyleSheet('background-color: green') button.move(300, 10) pm=QPixmap('subiao.png') #創建一張像素圖紙 pm1=pm.scaled(20,20) #縮放pm圖紙,賦值給圖紙pm1 #參數 圖紙的寬高 cursor=QCursor(pm1,0,0) #創建鼠標對象 #參數1 圖紙 #參數2 參數3 鼠標熱點坐標;默認-1,圖紙中心點;0,0圖紙左上角 label.setCursor(cursor) # 設置鼠標形狀 if __name__=='__main__': app=QApplication(sys.argv) #創建應用 window=win() window.show() sys.exit(app.exec_())
unsetCursor() 重置形狀-鼠標恢復默認
獲取鼠標對象:
cursor() -> QCursor 獲取鼠標對象
pm2=self.cursor() #獲取鼠標對象
s=pm2.pos() #提取鼠標位置,相對於屏幕 QPoint(1184, 62)
pm2.setPos(0,0) #設置鼠標位置