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基于scapy实现修改IP发送请求的方法示例
Jul 08 Python
Python Numpy 数组的初始化和基本操作
Mar 13 Python
VSCode下配置python调试运行环境的方法
Apr 06 Python
python list是否包含另一个list所有元素的实例
May 04 Python
Python创建或生成列表的操作方法
Jun 19 Python
Python程序打包工具py2exe和PyInstaller详解
Jun 28 Python
Python 给定的经纬度标注在地图上的实现方法
Jul 05 Python
Pytorch实现的手写数字mnist识别功能完整示例
Dec 13 Python
利用python实现凯撒密码加解密功能
Mar 31 Python
解决keras使用cov1D函数的输入问题
Jun 29 Python
Python爬虫小例子——爬取51job发布的工作职位
Jul 10 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
Feb 03 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开发工具
2015/11/09 PHP
Laravel框架之解决前端显示图片问题
2019/10/24 PHP
javascript 函数速查表
2010/02/07 Javascript
5个书写JavaScript代码的坏习惯,看看你中枪了没?
2014/11/06 Javascript
使用pjax实现无刷新更改页面url
2015/02/05 Javascript
jfinal与bootstrap的登录跳转实战演习
2015/09/22 Javascript
省市选择的简单实现(基于zepto.js)
2016/06/21 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
2016/10/24 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
JS跳转手机站url的若干注意事项
2017/10/18 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
利用Dectorator分模块存储Vuex状态的实现
2019/02/05 Javascript
vue自定义指令之面板拖拽的实现
2019/04/14 Javascript
微信小程序实现搜索指定景点周边美食、酒店
2019/05/18 Javascript
element-ui 中使用upload多文件上传只请求一次接口
2019/07/19 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
分享一款超好用的JavaScript 打包压缩工具
2020/04/26 Javascript
在vue项目中封装echarts的步骤
2020/12/25 Vue.js
Python中函数的多种格式和使用实例及小技巧
2015/04/13 Python
Python爬取数据保存为Json格式的代码示例
2019/04/09 Python
Django Aggregation聚合使用方法解析
2019/08/01 Python
如何在mac环境中用python处理protobuf
2019/12/25 Python
使用Puppeteer爬取微信文章的实现
2020/02/11 Python
基于opencv实现简单画板功能
2020/08/02 Python
python 还原梯度下降算法实现一维线性回归
2020/10/22 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
2020/10/27 Python
很酷的HTML5电子书翻页动画特效
2016/02/25 HTML / CSS
美国最大的珠宝首饰网上商城:Jewelry.com
2016/07/22 全球购物
高山背包:High Sierra
2017/11/23 全球购物
师范大学应届生求职信
2013/11/21 职场文书
企业安全生产月活动总结
2014/07/05 职场文书
六一儿童节活动总结
2014/08/27 职场文书
领导干部群众路线对照检查材料
2014/11/05 职场文书
2016关于预防职务犯罪的心得体会
2016/01/21 职场文书
MySQL 条件查询的常用操作
2022/04/28 MySQL