本文是对《Python Qt GUI快速编程》的第10章的例子events用Python3+PyQt5进行改写,涉及到重新实现QWidget的事件处理程序。本例子涉及到上下文菜单,鼠标事件,键盘事件,可作为重新实现事件处理程序的参考。
成都创新互联2013年开创至今,是专业互联网技术服务公司,拥有项目成都网站制作、成都网站设计、外贸营销网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元琼海做网站,已为上家服务,为琼海各地企业和个人服务,联系电话:028-86922220注:在创建上下文菜单最简单的方式使用Qwidget.addAction()把动作添加到窗口部件中,再把窗口部件的上下文菜单策略设置为Qt.ActionsContextMenu即可,但是如果像本例子一样要根据不同的状态来提供不同的选项,则要重新实现上下文菜单事件处理程序。
#!/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_()
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款