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)常用操作方法小结
Feb 02 Python
Python简单计算数组元素平均值的方法示例
Dec 26 Python
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
Jul 30 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
Jul 11 Python
在python 中split()使用多符号分割的例子
Jul 15 Python
python3 selenium自动化 下拉框定位的例子
Aug 23 Python
Python 取numpy数组的某几行某几列方法
Oct 24 Python
python使用python-pptx删除ppt某页实例
Feb 14 Python
Python实现封装打包自己写的代码,被python import
Jul 12 Python
Python局部变量与全局变量区别原理解析
Jul 14 Python
Python实现手势识别
Oct 21 Python
pycharm配置安装autopep8自动规范代码的实现
Mar 02 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去掉字符串的最后一个字符附substr()的用法
2011/03/23 PHP
PHP四大安全策略
2014/03/12 PHP
php字符串分割函数用法实例
2015/03/17 PHP
PHP的命令行命令使用指南
2015/08/18 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
IE之动态添加DOM节点触发window.resize事件
2010/07/27 Javascript
利用javascript判断文件是否存在
2013/12/31 Javascript
jquery选择器之层级过滤选择器详解
2014/01/27 Javascript
JavaScript打印网页指定区域的例子
2014/05/03 Javascript
让浏览器DOM元素最后加载的js方法
2014/07/29 Javascript
实例讲解避免javascript冲突的方法
2016/01/03 Javascript
angularJs使用$watch和$filter过滤器制作搜索筛选实例
2017/06/01 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
2018/09/28 Javascript
JavaScript相等运算符的九条规则示例详解
2019/10/20 Javascript
[03:53]2016国际邀请赛中国区预选赛第三日TOP10精彩集锦
2016/06/29 DOTA
一个简单的python程序实例(通讯录)
2013/11/29 Python
python OpenCV学习笔记实现二维直方图
2018/02/08 Python
将字典转换为DataFrame并进行频次统计的方法
2018/04/08 Python
Python对CSV、Excel、txt、dat文件的处理
2018/09/18 Python
浅谈python 读excel数值为浮点型的问题
2018/12/25 Python
在python中用print()输出多个格式化参数的方法
2019/07/16 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
sklearn-SVC实现与类参数详解
2019/12/10 Python
Python 多线程共享变量的实现示例
2020/04/17 Python
Python类绑定方法及非绑定方法实例解析
2020/10/09 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
使用css3做0.5px的细线的示例代码
2018/01/18 HTML / CSS
德国珠宝和配件商店:Styleserver
2021/02/23 全球购物
怀念母亲教学反思
2014/04/28 职场文书
政风行风建设责任书
2014/07/23 职场文书
公司领导班子召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
个人整改措施书面材料
2014/10/24 职场文书
小学教师教学随笔
2015/08/14 职场文书
【HBU】数据库第四周 单表查询
2021/04/05 SQL Server