首页 > 编程 > Python > 正文

python3+PyQt5重新实现QT事件处理程序

2020-02-22 23:44:38
字体:
来源:转载
供稿:网友

本文是对《Python Qt GUI快速编程》的第10章的例子events用Python3+PyQt5进行改写,涉及到重新实现QWidget的事件处理程序。本例子涉及到上下文菜单,鼠标事件,键盘事件,可作为重新实现事件处理程序的参考。

注:在创建上下文菜单最简单的方式使用Qwidget.addAction()把动作添加到窗口部件中,再把窗口部件的上下文菜单策略设置为Qt.ActionsContextMenu即可,但是如果像本例子一样要根据不同的状态来提供不同的选项,则要重新实现上下文菜单事件处理程序。

#!/usr/bin/env python3import sysfrom PyQt5.QtCore import (QEvent, QTimer, Qt)from PyQt5.QtWidgets import (QApplication, QMenu, QWidget)from PyQt5.QtGui import QPainterclass 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_()            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表