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


Posted in Python onApril 19, 2018

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

注:在创建上下文菜单最简单的方式使用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_()

运行结果:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python里对list中的整数求平均并排序
Sep 12 Python
详解 Python 读写XML文件的实例
Aug 02 Python
python利用smtplib实现QQ邮箱发送邮件
May 20 Python
python实现下载pop3邮件保存到本地
Jun 19 Python
解决sublime+python3无法输出中文的问题
Dec 12 Python
Python从单元素字典中获取key和value的实例
Dec 31 Python
python SQLAlchemy 中的Engine详解
Jul 04 Python
Django 项目重命名的实现步骤解析
Aug 14 Python
Python进程间通信multiprocess代码实例
Mar 18 Python
Python+Opencv身份证号码区域提取及识别实现
Aug 25 Python
浅谈Selenium+Webdriver 常用的元素定位方式
Jan 13 Python
利用Python实现模拟登录知乎
May 25 Python
python3+PyQt5重新实现自定义数据拖放处理
Apr 19 #Python
python之从文件读取数据到list的实例讲解
Apr 19 #Python
python实现读取大文件并逐行写入另外一个文件
Apr 19 #Python
python按行读取文件,去掉每行的换行符\n的实例
Apr 19 #Python
PyQt5每天必学之拖放事件
Aug 27 #Python
sublime python3 输入换行不结束的方法
Apr 19 #Python
PyQt5每天必学之像素图控件QPixmap
Apr 19 #Python
You might like
PHP抓取及分析网页的方法详解
2016/04/26 PHP
javascript验证上传文件的类型限制必须为某些格式
2013/11/14 Javascript
js监听鼠标点击和键盘点击事件并自动跳转页面
2014/09/24 Javascript
node.js中的http.response.end方法使用说明
2014/12/14 Javascript
在JavaScript中使用NaN值的方法
2015/06/05 Javascript
jQuery图片轮播插件——前端开发必看
2016/05/31 Javascript
JS实现简单的右下角弹出提示窗口完整实例
2016/06/21 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
vue实现简单实时汇率计算功能
2017/01/15 Javascript
详解vue mint-ui源码解析之loadmore组件
2017/10/11 Javascript
js获取html页面代码中图片地址的实现代码
2018/03/05 Javascript
使用RN Animated做一个“添加购物车”动画的方法
2018/09/12 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
vue使用v-for实现hover点击效果
2018/09/29 Javascript
利用Vue实现一个markdown编辑器实例代码
2019/05/19 Javascript
vuex 中插件的编写案例解析
2019/06/10 Javascript
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
JavaScript Canvas编写炫彩的网页时钟
2019/10/16 Javascript
解决vue项目打包上服务器显示404错误,本地没出错的问题
2020/11/03 Javascript
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
2015/03/31 Python
python函数形参用法实例分析
2015/08/04 Python
使用Python的Tornado框架实现一个Web端图书展示页面
2016/07/11 Python
SQLite3中文编码 Python的实现
2017/01/11 Python
Python类的动态修改的实例方法
2017/03/24 Python
详谈python3中用for循环删除列表中元素的坑
2018/04/19 Python
python环境路径配置以及命令行运行脚本
2019/04/02 Python
Django给admin添加Action的步骤详解
2019/05/01 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
Python模块的制作方法实例分析
2019/12/21 Python
django数据模型(Model)的字段类型解析
2019/12/25 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
2020/02/21 Python
Python 列表反转显示的四种方法
2020/11/16 Python
如何启动时不需输入用户名与密码
2014/05/09 面试题
技校生自我鉴定
2013/12/08 职场文书
邹越演讲观后感
2015/06/15 职场文书
导游词之无锡唐城
2019/12/12 职场文书