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实现面向对像的ASP程序实例
Nov 10 Python
python正则中最短匹配实现代码
Jan 16 Python
Python判断一个三位数是否为水仙花数的示例
Nov 13 Python
python实现三维拟合的方法
Dec 29 Python
Python 按字典dict的键排序,并取出相应的键值放于list中的实例
Feb 12 Python
python实现宿舍管理系统
Nov 22 Python
django formset实现数据表的批量操作的示例代码
Dec 06 Python
python实现名片管理器的示例代码
Dec 17 Python
使用TensorFlow搭建一个全连接神经网络教程
Feb 06 Python
python内打印变量之%和f的实例
Feb 19 Python
Python OpenCV读取显示视频的方法示例
Feb 20 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
Feb 07 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 安全检测代码片段(分享)
2013/07/05 PHP
PHP导入导出Excel代码
2015/07/07 PHP
js 方法实现返回多个数据的代码
2009/04/30 Javascript
javascript中检测变量的类型的代码
2010/12/28 Javascript
JS无限树状列表实现代码
2011/01/11 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
2013/05/21 Javascript
javascript使用定时函数实现跳转到某个页面
2013/12/25 Javascript
js中top的作用深入剖析
2014/03/04 Javascript
JS、jquery实现几分钟前、几小时前、几天前等时间差显示效果的代码实例分享
2014/04/11 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
2015/11/22 Javascript
JS实现添加,替换,删除节点元素的方法
2016/06/30 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
bootstrap table 多选框分页保留示例代码
2017/03/08 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
nodejs实现简单的gulp打包
2017/12/21 NodeJs
JS运动特效之任意值添加运动的方法分析
2018/01/24 Javascript
浅析Vue下的components模板使用及应用
2019/11/27 Javascript
js实现直播点击飘心效果
2020/08/19 Javascript
详解webpack的clean-webpack-plugin插件报错
2020/10/16 Javascript
python批量修改文件后缀示例代码分享
2013/12/24 Python
python采用requests库模拟登录和抓取数据的简单示例
2014/07/05 Python
利用python爬取散文网的文章实例教程
2017/06/18 Python
Python基于回溯法子集树模板解决数字组合问题实例
2017/09/02 Python
Python实现修改文件内容的方法分析
2018/03/25 Python
对Python中内置异常层次结构详解
2018/10/18 Python
Python的高阶函数用法实例分析
2019/04/11 Python
numpy.ndarray 实现对特定行或列取值
2019/12/05 Python
Django Admin设置应用程序及模型顺序方法详解
2020/04/01 Python
使用Django的JsonResponse返回数据的实现
2021/01/15 Python
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
澳大利亚实惠时尚女装商店:Katies
2019/06/16 全球购物
Linux如何为某个操作添加别名
2013/03/01 面试题
2015年幼儿园大班工作总结
2015/04/25 职场文书
农民工工资保障承诺书
2015/05/04 职场文书
css 中多种边框的实现小窍门
2021/04/07 HTML / CSS
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL