python3+PyQt5重新實(shí)現(xiàn)QT事件處理程序
本文是對(duì)《Python Qt GUI快速編程》的第10章的例子events用Python3+PyQt5進(jìn)行改寫(xiě),涉及到重新實(shí)現(xiàn)QWidget的事件處理程序。本例子涉及到上下文菜單,鼠標(biāo)事件,鍵盤(pán)事件,可作為重新實(shí)現(xiàn)事件處理程序的參考。
注:在創(chuàng)建上下文菜單最簡(jiǎn)單的方式使用Qwidget.addAction()把動(dòng)作添加到窗口部件中,再把窗口部件的上下文菜單策略設(shè)置為Qt.ActionsContextMenu即可,但是如果像本例子一樣要根據(jù)不同的狀態(tài)來(lái)提供不同的選項(xiàng),則要重新實(shí)現(xiàn)上下文菜單事件處理程序。
#!/usr/bin/env python3
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")
QTimer.singleShot(0, self.giveHelp) # Avoids first resize msg
def giveHelp(self):
self.text = "Click to toggle mouse tracking"
self.update()
def closeEvent(self, event):
print("Closed")
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("Thre&e")
threeAction.triggered.connect(self.three)
menu.exec_(event.globalPos())
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()
def paintEvent(self, event):
text = self.text
i = text.find("\n\n")
if i >= 0:
text = text[0:i]
if self.key:
text += "\n\nYou pressed: {0}".format(self.key)
painter = QPainter(self)
painter.setRenderHint(QPainter.TextAntialiasing)
painter.drawText(self.rect(), Qt.AlignCenter, text)
if self.message:
painter.drawText(self.rect(), Qt.AlignBottom|Qt.AlignHCenter,
self.message)
QTimer.singleShot(5000, self.clearMessage)
QTimer.singleShot(5000, self.update)
def clearMessage(self):
self.message=""
def resizeEvent(self, event):
self.text = "Resized to QSize({0}, {1})".format(
event.size().width(), event.size().height())
self.update()
def mouseReleaseEvent(self, event):
if self.justDoubleClicked:
self.justDoubleClicked = False
else:
self.setMouseTracking(not self.hasMouseTracking())
if self.hasMouseTracking():
self.text = "Mouse tracking is on.\n"+\
"Try moving the mouse!\n"+\
"Single click to switch it off"
else:
self.text = "Mouse tracking is off.\n"+\
"Single click to switch it on"
self.update()
def mouseMoveEvent(self, event):
if not self.justDoubleClicked:
globalPos = self.mapToGlobal(event.pos())
self.text = "The mouse is at\nQPoint({0}, {1}) "+\
"in widget coords, and\n"+\
"QPoint({2}, {3}) in screen coords".format(
event.pos().x(), event.pos().y(), globalPos.x(),
globalPos.y())
self.update()
def mouseDoubleClickEvent(self, event):
self.justDoubleClicked = True
self.text = "Double-clicked."
self.update()
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)
def event(self, event):
if (event.type() == QEvent.KeyPress and
event.key() == Qt.Key_Tab):
self.key = "Tab captured in event()"
self.update()
return True
return QWidget.event(self, event)
if __name__ == "__main__":
app = QApplication(sys.argv)
form = Widget()
form.show()
app.exec_()
運(yùn)行結(jié)果:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python+OpenCV實(shí)現(xiàn)車(chē)牌號(hào)碼識(shí)別
這篇文章主要介紹了python+OpenCV實(shí)現(xiàn)車(chē)牌號(hào)碼識(shí)別,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
python使用布隆過(guò)濾器的實(shí)現(xiàn)示例
這篇文章主要介紹了python使用布隆過(guò)濾器的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Python實(shí)現(xiàn)數(shù)字小寫(xiě)轉(zhuǎn)大寫(xiě)的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)數(shù)字小寫(xiě)轉(zhuǎn)大寫(xiě)的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-12-12
Python實(shí)現(xiàn)FTP上傳文件或文件夾實(shí)例(遞歸)
本篇文章主要介紹了Python實(shí)現(xiàn)FTP上傳文件或文件夾實(shí)例(遞歸),具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01

