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 相关文章推荐
Python3搜索及替换文件中文本的方法
May 22 Python
结合Python的SimpleHTTPServer源码来解析socket通信
Jun 27 Python
分享python数据统计的一些小技巧
Jul 21 Python
利用Python自动监控网站并发送邮件告警的方法
Aug 24 Python
python3解析库pyquery的深入讲解
Jun 26 Python
对python requests发送json格式数据的实例详解
Dec 19 Python
python引用(import)某个模块提示没找到对应模块的解决方法
Jan 19 Python
Python3实现zip分卷压缩过程解析
Oct 09 Python
提升python处理速度原理及方法实例
Dec 25 Python
如何打包Python Web项目实现免安装一键启动的方法
May 21 Python
关于Python字符编码与二进制不得不说的一些事
Oct 04 Python
opencv 分类白天与夜景视频的方法
Jun 05 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中强制下载文件的代码(解决了IE下中文文件名乱码问题)
2011/05/09 PHP
php解析url的三个示例
2014/01/20 PHP
php简单生成随机数的方法
2015/07/30 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
PHP实现微信提现功能
2018/09/30 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
2019/03/07 PHP
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(上:事件篇)
2010/03/24 Javascript
js创建对象的几种常用方式小结(推荐)
2010/10/24 Javascript
EditPlus注册码生成器(js代码实现)
2013/03/25 Javascript
Js Jquery创建一个弹出层可加载一个页面
2014/05/08 Javascript
JS搜狐面试题分析
2016/12/16 Javascript
解析jquery easyui tree异步加载子节点问题
2017/03/08 Javascript
react-router4 嵌套路由的使用方法
2017/07/24 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
JavaScript代码实现txt文件的上传预览功能
2018/03/27 Javascript
解决axios发送post请求返回400状态码的问题
2018/08/11 Javascript
使用form-create动态生成vue自定义组件和嵌套表单组件
2019/01/18 Javascript
ssm+vue前后端分离框架整合实现(附源码)
2020/07/08 Javascript
vue解决跨域问题(推荐)
2020/11/10 Javascript
Python判断值是否在list或set中的性能对比分析
2016/04/16 Python
浅谈python 四种数值类型(int,long,float,complex)
2016/06/08 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
2018/01/24 Python
通过Pandas读取大文件的实例
2018/06/07 Python
基于Python的PIL库学习详解
2019/05/10 Python
python中tkinter的应用:修改字体的实例讲解
2019/07/17 Python
python模块如何查看
2020/06/16 Python
html5新特性与用法大全
2018/09/13 HTML / CSS
Wolford法国官网:奥地利奢侈内衣品牌
2020/08/11 全球购物
金属材料工程个人求职的自我评价
2013/12/04 职场文书
自我鉴定怎么写
2013/12/05 职场文书
企业军训感想
2014/02/07 职场文书
咖啡厅商业计划书
2014/09/15 职场文书
用人单位终止解除劳动合同证明书
2014/10/06 职场文书
python 如何在 Matplotlib 中绘制垂直线
2021/04/02 Python
《英雄联盟》2022日蚀、月蚀皮肤演示 黑潮亚索曝光
2022/04/13 其他游戏
MySql中的json_extract函数处理json字段详情
2022/06/05 MySQL