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将多个文本文件合并为一个文本的代码(便于搜索)
Mar 13 Python
python赋值操作方法分享
Mar 23 Python
用Python制作在地图上模拟瘟疫扩散的Gif图
Mar 31 Python
在Python中使用next()方法操作文件的教程
May 24 Python
详解Python3中的Sequence type的使用
Aug 01 Python
Python实现网站注册验证码生成类
Jun 08 Python
Matplotlib 生成不同大小的subplots实例
May 25 Python
Python并发之多进程的方法实例代码
Aug 15 Python
Python随机函数库random的使用方法详解
Aug 21 Python
FFT快速傅里叶变换的python实现过程解析
Oct 21 Python
如何在python中处理配置文件代码实例
Sep 27 Python
Django url 路由匹配过程详解
Jan 22 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 socket并借助telnet实现简单的聊天程序
2013/06/18 PHP
PHP设计模式之策略模式原理与用法实例分析
2019/04/04 PHP
点击广告后才能获得下载地址
2006/10/26 Javascript
基于jquery的jqDnR拖拽溢出的修改
2011/02/12 Javascript
JQuery优缺点分析说明
2011/04/10 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
两种方法实现在HTML页面加载完毕后运行某个js
2014/06/16 Javascript
javascript判断复选框是否选中的方法
2015/10/16 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
Javascript下拉刷新的简单实现
2017/02/14 Javascript
vue登录注册及token验证实现代码
2017/12/14 Javascript
vue使用Element组件时v-for循环里的表单项验证方法
2018/06/28 Javascript
[09:59]DOTA2-DPC中国联赛2月7日Recap集锦
2021/03/11 DOTA
在Python的Flask框架下收发电子邮件的教程
2015/04/21 Python
Python中绑定与未绑定的类方法用法分析
2016/04/29 Python
Python实现的异步代理爬虫及代理池
2017/03/17 Python
Python 网页解析HTMLParse的实例详解
2017/08/10 Python
详谈pandas中agg函数和apply函数的区别
2018/04/20 Python
python for循环remove同一个list过程解析
2019/08/14 Python
tensorflow求导和梯度计算实例
2020/01/23 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
CSS3 选择器 伪类选择器介绍
2012/01/21 HTML / CSS
意大利简约的休闲品牌:Aspesi
2018/02/08 全球购物
美国相机和电子产品零售商:Beach Camera
2020/11/26 全球购物
linux面试题参考答案(3)
2012/09/13 面试题
介绍一下Python中webbrowser的用法
2013/05/07 面试题
金属材料工程个人求职的自我评价
2013/12/04 职场文书
入党积极分子思想汇报
2014/01/02 职场文书
2014年大班元旦活动方案
2014/02/26 职场文书
农村婚庆司仪主持词
2014/03/15 职场文书
毕业生面试求职信
2014/06/23 职场文书
2015年董事长秘书工作总结
2015/07/23 职场文书
2015年网络舆情工作总结
2015/07/24 职场文书
考研经验交流会策划书
2015/11/02 职场文书
python某漫画app逆向
2021/03/31 Python
用Python创建简易网站图文教程
2021/06/11 Python