pyqt5 鼠標操作


 

  

#資料  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)  #設置鼠標位置

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM