Python鼠標事件及坐標獲取窗口和屏幕坐標
本文主要介紹重寫自帶的一些方法,拾取屏幕和窗口坐標信息
效果如下:
分析:
定時服務(wù):在固定一段時間后執(zhí)行相關(guān)的函數(shù)方法,例如這里表示的是在0秒后執(zhí)行self.giveHelp這個方法
QTimer.singleShot(0, self.giveHelp)
重寫關(guān)閉事件
def giveHelp(self): self.text = "請點擊這里觸發(fā)追蹤鼠標的功能" self.update() # self.update()表示的是刷新
重寫上下文菜單事件
#這里的重寫上下文菜單表示的是右鍵所顯示的菜單 def contextMenuEvent(self, event): menu = QMenu(self) oneAction = menu.addAction("&one") #這里表示的是右鍵后再選擇出現(xiàn)時連接的信號和槽函數(shù) oneAction.triggered.connect(self.one) # 這里表示的是添加一行分割線 menu.addSeparator() menu.exec_(event.globaPos)
重寫自帶的繪制事件 也就是自定義
def paintEvent(self, event): text = self.text i = text.find("\n\n") if i>=0: text = text[0:1] if self.key:這個表示的是如果觸發(fā)了鍵盤事件那么這里就記錄按鈕事件的信息 text += "\n\n你按下了: {0}".format(self.key) painter = QPainter(self) painter.setRebderHint(QPainter.TextAntialiasing) painter.drawText(self.rect(), Qt.AlignCenter, text)#繪制文本信息
重新實現(xiàn)調(diào)整窗口大小事件
也就是說在界面窗口大小出現(xiàn)變化的時候回調(diào)用這個方法
def resizeEvent(self,event): self.text = "調(diào)整窗口大小為: QSize({0},{1})".format(event.size().width(), event.size().height()) self.update()
重新實現(xiàn)鼠標的釋放事件
也就是說當鼠標雙擊完成或者是單擊完成之后調(diào)用的方法
def mouseReleaseEvent(self, event):
重新實現(xiàn)鼠標的移動事件
也就是說在鼠標移動的過程中就會調(diào)用這個方法
def mouseMoveEvent(self, event): # 這里的意思就是將窗口的坐標轉(zhuǎn)化為屏幕的坐標 globalPos = self.mapTpGlobal(event.pos()) self.text = """鼠標的位置為: 窗口坐標為: Qpoint({0},{1}),屏幕坐標為:屏幕坐標為:QPoint({2},{3})""".format( event.pos().x(),event.pos().y(), globalPos.x(), globalPos.y()) ) self.update()
重新實現(xiàn)鼠標雙擊事件
def mouseDoubleClickEvent(self, event): self.justDoubleClicked = True self.text = "你雙擊了鼠標" self.update()
重新實現(xiàn)鍵盤按下事件
def keyPressEvent(self, event): if event.key()==QT.Key_Home: self.key = "Home"
源碼如下
import sys from PyQt5.QtCore import (QEvent, QTimer, Qt) from PyQt5.QtWidgets import (QApplication, QMenu, QWidget) from PyQt5.QtGui import QPainter class Widget(QWidget): def __init__(self, parent=None): super(Widget, self).__init__(parent) self.justDoubleClicked = False self.key = "" self.text = "" self.message = "" self.resize(400, 300) self.move(100, 100) self.setWindowTitle("Events") # 這里表示6秒鐘后調(diào)用giveHelp這個方法 QTimer.singleShot(6000, self.giveHelp) # 避免窗口大小重繪事件的影響,可以把參數(shù)0改變成3000(3秒),然后在運行,就可以明白這行代碼的意思。 def giveHelp(self): self.text = "請點擊這里觸發(fā)追蹤鼠標功能" self.update() # 重繪事件,也就是觸發(fā)paintEvent函數(shù)。 '''重新實現(xiàn)關(guān)閉事件''' def closeEvent(self, event): print("Closed") '''重新實現(xiàn)上下文菜單事件,也就是右鍵的菜單''' def contextMenuEvent(self, event): menu = QMenu(self) oneAction = menu.addAction("&One") twoAction = menu.addAction("&Two") oneAction.triggered.connect(self.one) twoAction.triggered.connect(self.two) if not self.message: menu.addSeparator() threeAction = menu.addAction("Three") threeAction.triggered.connect(self.three) menu.exec_(event.globalPos()) '''上下文菜單槽函數(shù)''' def one(self): self.message = "Menu option One" self.update() def two(self): self.message = "Menu option Two" self.update() def three(self): self.message = "Menu option Three" self.update() '''重新實現(xiàn)繪制事件''' def paintEvent(self, event): text = self.text i = text.find("\n\n") if i >= 0: text = text[0:i] if self.key: # 若觸發(fā)了鍵盤按鈕,則在文本信息中記錄這個按鈕信息。 text += "\n\n你按下了: {0}".format(self.key) painter = QPainter(self) painter.setRenderHint(QPainter.TextAntialiasing) painter.drawText(self.rect(), Qt.AlignCenter, text) # 繪制信息文本的內(nèi)容 if self.message: # 若消息文本存在則在底部居中繪制消息,5秒鐘后清空消息文本并重繪。 painter.drawText(self.rect(), Qt.AlignBottom | Qt.AlignHCenter, self.message) QTimer.singleShot(5000, self.clearMessage) QTimer.singleShot(5000, self.update) '''清空消息文本的槽函數(shù)''' def clearMessage(self): self.message = "" '''重新實現(xiàn)調(diào)整窗口大小事件''' def resizeEvent(self, event): self.text = "調(diào)整窗口大小為: QSize({0}, {1})".format( event.size().width(), event.size().height()) self.update() '''重新實現(xiàn)鼠標釋放事件''' def mouseReleaseEvent(self, event): # 若鼠標釋放為雙擊釋放,則不跟蹤鼠標移動 # 若鼠標釋放為單擊釋放,則需要改變跟蹤功能的狀態(tài),如果開啟跟蹤功能的話就跟蹤,不開啟跟蹤功能就不跟蹤 if self.justDoubleClicked: self.justDoubleClicked = False else: self.setMouseTracking(not self.hasMouseTracking()) # 單擊鼠標 if self.hasMouseTracking(): self.text = "開啟鼠標跟蹤功能.\n" + \ "請移動一下鼠標!\n" + \ "單擊鼠標可以關(guān)閉這個功能" else: self.text = "關(guān)閉鼠標跟蹤功能.\n" + \ "單擊鼠標可以開啟這個功能" self.update() '''重新實現(xiàn)鼠標移動事件''' def mouseMoveEvent(self, event): if not self.justDoubleClicked: globalPos = self.mapToGlobal(event.pos()) # 窗口坐標轉(zhuǎn)換為屏幕坐標 self.text = """鼠標位置: 窗口坐標為:QPoint({0}, {1}) 屏幕坐標為:QPoint({2}, {3}) """.format(event.pos().x(), event.pos().y(), globalPos.x(), globalPos.y()) self.update() '''重新實現(xiàn)鼠標雙擊事件''' def mouseDoubleClickEvent(self, event): self.justDoubleClicked = True self.text = "你雙擊了鼠標" self.update() '''重新實現(xiàn)鍵盤按下事件''' def keyPressEvent(self, event): self.key = "" if event.key() == Qt.Key_Home: self.key = "Home" elif event.key() == Qt.Key_End: self.key = "End" elif event.key() == Qt.Key_PageUp: if event.modifiers() & Qt.ControlModifier: self.key = "Ctrl+PageUp" else: self.key = "PageUp" elif event.key() == Qt.Key_PageDown: if event.modifiers() & Qt.ControlModifier: self.key = "Ctrl+PageDown" else: self.key = "PageDown" elif Qt.Key_A <= event.key() <= Qt.Key_Z: if event.modifiers() & Qt.ShiftModifier: self.key = "Shift+" self.key += event.text() if self.key: self.key = self.key self.update() else: QWidget.keyPressEvent(self, event) '''重新實現(xiàn)其他事件,適用于PyQt沒有提供該事件的處理函數(shù)的情況,Tab鍵由于涉及焦點切換,不會傳遞給keyPressEvent,因此,需要在這里重新定義。''' def event(self, event): if (event.type() == QEvent.KeyPress and event.key() == Qt.Key_Tab): self.key = "在event()中捕獲Tab鍵" self.update() return True return QWidget.event(self, event) if __name__ == "__main__": app = QApplication(sys.argv) form = Widget() form.show() app.exec_()
以上就是Python鼠標事件及坐標獲取窗口和屏幕坐標的詳細內(nèi)容,更多關(guān)于鼠標事件及坐標獲取窗口和屏幕坐標的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python?tkinter實現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細介紹了python?tkinter實現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02python 如何用urllib與服務(wù)端交互(發(fā)送和接收數(shù)據(jù))
這篇文章主要介紹了python 如何用urllib與服務(wù)端交互(發(fā)送和接收數(shù)據(jù)),幫助大家更好的理解和學(xué)習使用python,感興趣的朋友可以了解下2021-03-03一篇文章教你掌握python數(shù)據(jù)類型的底層實現(xiàn)
這篇文章主要介紹了Python 數(shù)據(jù)類型的底層實現(xiàn)原理分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-09-09Pytorch+PyG實現(xiàn)EdgeCNN過程示例詳解
這篇文章主要為大家介紹了Pytorch+PyG實現(xiàn)EdgeCNN過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04利用django-suit模板添加自定義的菜單、頁面及設(shè)置訪問權(quán)限
這篇文章主要給大家介紹了關(guān)于利用django-suit模板添加自定義的菜單、頁面及設(shè)置訪問權(quán)限的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起看看吧2018-07-07Python?matplotlib如何簡單繪制不同類型的表格
通過Matplotlib,開發(fā)者可以僅需要幾行代碼,便可以生成繪圖,直方圖,功率譜,條形圖,錯誤圖,散點圖等,下面這篇文章主要給大家介紹了關(guān)于Python?matplotlib如何簡單繪制不同類型表格的相關(guān)資料,需要的朋友可以參考下2022-07-07Tensorflow與Keras自適應(yīng)使用顯存方式
這篇文章主要介紹了Tensorflow與Keras自適應(yīng)使用顯存方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06